Hướng dẫn mysql create index on table - mysql tạo chỉ mục trên bảng

13.1.15 & NBSP; Tạo câu lệnh INDEX

CREATE [UNIQUE | FULLTEXT | SPATIAL] INDEX index_name
    [index_type]
    ON tbl_name (key_part,...)
    [index_option]
    [algorithm_option | lock_option] ...

key_part: {col_name [(length)] | (expr)} [ASC | DESC]

index_option: {
    KEY_BLOCK_SIZE [=] value
  | index_type
  | WITH PARSER parser_name
  | COMMENT 'string'
  | {VISIBLE | INVISIBLE}
  | ENGINE_ATTRIBUTE [=] 'string'
  | SECONDARY_ENGINE_ATTRIBUTE [=] 'string'
}

index_type:
    USING {BTREE | HASH}

algorithm_option:
    ALGORITHM [=] {DEFAULT | INPLACE | COPY}

lock_option:
    LOCK [=] {DEFAULT | NONE | SHARED | EXCLUSIVE}

Thông thường, bạn tạo tất cả các chỉ mục trên bảng tại thời điểm bảng được tạo bằng

CREATE TABLE t1 (col1 INT, col2 INT, INDEX func_index ((ABS(col1))));
CREATE INDEX idx1 ON t1 ((col1 + col2));
CREATE INDEX idx2 ON t1 ((col1 + col2), (col1 - col2), col1);
ALTER TABLE t1 ADD INDEX ((col1 * 40) DESC);
2. Xem Phần & NBSP; 13.1.20, Tuyên bố Tạo bảng. Hướng dẫn này đặc biệt quan trọng đối với các bảng
CREATE TABLE t1 (col1 INT, col2 INT, INDEX func_index ((ABS(col1))));
CREATE INDEX idx1 ON t1 ((col1 + col2));
CREATE INDEX idx2 ON t1 ((col1 + col2), (col1 - col2), col1);
ALTER TABLE t1 ADD INDEX ((col1 * 40) DESC);
3, trong đó khóa chính xác định bố cục vật lý của các hàng trong tệp dữ liệu.
CREATE TABLE t1 (col1 INT, col2 INT, INDEX func_index ((ABS(col1))));
CREATE INDEX idx1 ON t1 ((col1 + col2));
CREATE INDEX idx2 ON t1 ((col1 + col2), (col1 - col2), col1);
ALTER TABLE t1 ADD INDEX ((col1 * 40) DESC);
4 cho phép bạn thêm các chỉ mục vào các bảng hiện có.

CREATE TABLE t1 (col1 INT, col2 INT, INDEX func_index ((ABS(col1))));
CREATE INDEX idx1 ON t1 ((col1 + col2));
CREATE INDEX idx2 ON t1 ((col1 + col2), (col1 - col2), col1);
ALTER TABLE t1 ADD INDEX ((col1 * 40) DESC);
4 được ánh xạ tới câu lệnh
CREATE TABLE t1 (col1 INT, col2 INT, INDEX func_index ((ABS(col1))));
CREATE INDEX idx1 ON t1 ((col1 + col2));
CREATE INDEX idx2 ON t1 ((col1 + col2), (col1 - col2), col1);
ALTER TABLE t1 ADD INDEX ((col1 * 40) DESC);
6 để tạo các chỉ mục. Xem Phần & NBSP; 13.1.9, Tuyên bố bảng thay đổi.
CREATE TABLE t1 (col1 INT, col2 INT, INDEX func_index ((ABS(col1))));
CREATE INDEX idx1 ON t1 ((col1 + col2));
CREATE INDEX idx2 ON t1 ((col1 + col2), (col1 - col2), col1);
ALTER TABLE t1 ADD INDEX ((col1 * 40) DESC);
4 không thể được sử dụng để tạo
CREATE TABLE t1 (col1 INT, col2 INT, INDEX func_index ((ABS(col1))));
CREATE INDEX idx1 ON t1 ((col1 + col2));
CREATE INDEX idx2 ON t1 ((col1 + col2), (col1 - col2), col1);
ALTER TABLE t1 ADD INDEX ((col1 * 40) DESC);
8; sử dụng
CREATE TABLE t1 (col1 INT, col2 INT, INDEX func_index ((ABS(col1))));
CREATE INDEX idx1 ON t1 ((col1 + col2));
CREATE INDEX idx2 ON t1 ((col1 + col2), (col1 - col2), col1);
ALTER TABLE t1 ADD INDEX ((col1 * 40) DESC);
6 thay thế. Để biết thêm thông tin về các chỉ mục, hãy xem Phần & NBSP; 8.3.1, Cách MySQL sử dụng các chỉ mục.

CREATE TABLE t1 (col1 INT, col2 INT, INDEX func_index ((ABS(col1))));
CREATE INDEX idx1 ON t1 ((col1 + col2));
CREATE INDEX idx2 ON t1 ((col1 + col2), (col1 - col2), col1);
ALTER TABLE t1 ADD INDEX ((col1 * 40) DESC);
3 hỗ trợ các chỉ mục thứ cấp trên các cột ảo. Để biết thêm thông tin, xem Phần & NBSP; 13.1.20.9, Chỉ mục thứ cấp và các cột được tạo.

Khi cài đặt

INDEX ((col1 + col2), (col3 - col4))
1 được bật, hãy chạy câu lệnh
INDEX ((col1 + col2), (col3 - col4))
2 cho bảng
CREATE TABLE t1 (col1 INT, col2 INT, INDEX func_index ((ABS(col1))));
CREATE INDEX idx1 ON t1 ((col1 + col2));
CREATE INDEX idx2 ON t1 ((col1 + col2), (col1 - col2), col1);
ALTER TABLE t1 ADD INDEX ((col1 * 40) DESC);
3 sau khi tạo một chỉ mục trên bảng đó.

Bắt đầu với MySQL 8.0.17,

INDEX ((col1 + col2), (col3 - col4))
4 cho thông số kỹ thuật
INDEX ((col1 + col2), (col3 - col4))
5 có thể lấy mẫu
INDEX ((col1 + col2), (col3 - col4))
6 dưới dạng mảng
INDEX ((col1 + col2), (col3 - col4))
7) để tạo chỉ mục đa giá trị trên cột
INDEX ((col1 + col2), (col3 - col4))
8. Xem các chỉ mục đa giá trị.

Một đặc tả chỉ mục của mẫu

INDEX ((col1 + col2), (col3 - col4))
9,
INDEX (col1 + col2, col3 - col4)
0, ...) tạo một chỉ mục với nhiều phần chính. Các giá trị khóa chỉ mục được hình thành bằng cách kết hợp các giá trị của các phần khóa đã cho. Ví dụ
INDEX (col1 + col2, col3 - col4)
1 chỉ định một chỉ mục nhiều cột với các khóa chỉ mục bao gồm các giá trị từ
INDEX (col1 + col2, col3 - col4)
2,
INDEX (col1 + col2, col3 - col4)
3 và
INDEX (col1 + col2, col3 - col4)
4.

Thông số kỹ thuật

INDEX ((col1 + col2), (col3 - col4))
5 có thể kết thúc bằng
INDEX (col1 + col2, col3 - col4)
6 hoặc
INDEX (col1 + col2, col3 - col4)
7 để chỉ định xem các giá trị chỉ mục có được lưu trữ theo thứ tự tăng dần hay giảm dần hay không. Mặc định là tăng dần nếu không có trình xác định đơn hàng nào được đưa ra.
INDEX (col1 + col2, col3 - col4)
6 và
INDEX (col1 + col2, col3 - col4)
7 không được phép cho các chỉ mục
INDEX ((col1), (col2))
0.
INDEX (col1 + col2, col3 - col4)
6 và
INDEX (col1 + col2, col3 - col4)
7 cũng không được hỗ trợ cho các chỉ mục đa giá trị. Kể từ MySQL 8.0.12,
INDEX (col1 + col2, col3 - col4)
6 và
INDEX (col1 + col2, col3 - col4)
7 không được phép cho các chỉ mục
INDEX ((col1), (col2))
5.

Các phần sau đây mô tả các khía cạnh khác nhau của tuyên bố

CREATE TABLE t1 (col1 INT, col2 INT, INDEX func_index ((ABS(col1))));
CREATE INDEX idx1 ON t1 ((col1 + col2));
CREATE INDEX idx2 ON t1 ((col1 + col2), (col1 - col2), col1);
ALTER TABLE t1 ADD INDEX ((col1 * 40) DESC);
4:

  • Các bộ phận khóa tiền tố cột

  • Các bộ phận khóa chức năng

  • Chỉ số độc đáo

  • Chỉ số toàn văn

  • Chỉ số đa giá trị

  • Chỉ số không gian

  • Tùy chọn chỉ mục

  • Tùy chọn sao chép và khóa bảng

Các bộ phận khóa tiền tố cột

Các bộ phận khóa chức năng

  • Chỉ số độc đáo

  • Chỉ số toàn vănmust be specified for

    INDEX (col1, col2)
    3 and
    INDEX (col1, col2)
    4 key parts. Additionally,
    INDEX (col1, col2)
    3 and
    INDEX (col1, col2)
    4 columns can be indexed only for
    CREATE TABLE t1 (col1 INT, col2 INT, INDEX func_index ((ABS(col1))));
    CREATE INDEX idx1 ON t1 ((col1 + col2));
    CREATE INDEX idx2 ON t1 ((col1 + col2), (col1 - col2), col1);
    ALTER TABLE t1 ADD INDEX ((col1 * 40) DESC);
    3,
    INDEX (col1, col2)
    8, and
    INDEX (col1, col2)
    9 tables.

  • Chỉ số đa giá trịlimits are measured in bytes. However, prefix lengths for index specifications in

    CREATE TABLE tbl (
      col1 LONGTEXT,
      INDEX idx1 ((SUBSTRING(col1, 1, 10)))
    );
    SELECT * FROM tbl WHERE SUBSTRING(col1, 1, 9) = '123456789';
    SELECT * FROM tbl WHERE SUBSTRING(col1, 1, 10) = '1234567890';
    0,
    CREATE TABLE t1 (col1 INT, col2 INT, INDEX func_index ((ABS(col1))));
    CREATE INDEX idx1 ON t1 ((col1 + col2));
    CREATE INDEX idx2 ON t1 ((col1 + col2), (col1 - col2), col1);
    ALTER TABLE t1 ADD INDEX ((col1 * 40) DESC);
    6, and
    CREATE TABLE t1 (col1 INT, col2 INT, INDEX func_index ((ABS(col1))));
    CREATE INDEX idx1 ON t1 ((col1 + col2));
    CREATE INDEX idx2 ON t1 ((col1 + col2), (col1 - col2), col1);
    ALTER TABLE t1 ADD INDEX ((col1 * 40) DESC);
    4 statements are interpreted as number of characters for nonbinary string types (
    INDEX ((col1), (col2))
    9,
    INDEX (col1, col2)
    0,
    INDEX (col1, col2)
    4) and number of bytes for binary string types (
    INDEX (col1, col2)
    1,
    INDEX (col1, col2)
    2,
    INDEX (col1, col2)
    3). Take this into account when specifying a prefix length for a nonbinary string column that uses a multibyte character set.

    Chỉ số không gian

Tùy chọn chỉ mục

  • Tùy chọn sao chép và khóa bảng

  • Đối với các cột chuỗi, các chỉ mục có thể được tạo chỉ sử dụng phần hàng đầu của các giá trị cột, sử dụng cú pháp ________ 67 (____ 68) để chỉ định độ dài tiền tố chỉ mục:

Các tiền tố có thể được chỉ định cho các phần chính

INDEX ((col1), (col2))
9,
INDEX (col1, col2)
0,
INDEX (col1, col2)
1 và
INDEX (col1, col2)
2.

CREATE INDEX part_of_name ON customer (name(10));

Tiền tố phải được chỉ định cho các phần chính

INDEX (col1, col2)
3 và
INDEX (col1, col2)
4. Ngoài ra, các cột
INDEX (col1, col2)
3 và
INDEX (col1, col2)
4 chỉ có thể được lập chỉ mục cho các bảng
CREATE TABLE t1 (col1 INT, col2 INT, INDEX func_index ((ABS(col1))));
CREATE INDEX idx1 ON t1 ((col1 + col2));
CREATE INDEX idx2 ON t1 ((col1 + col2), (col1 - col2), col1);
ALTER TABLE t1 ADD INDEX ((col1 * 40) DESC);
3,
INDEX (col1, col2)
8 và
INDEX (col1, col2)
9.

Các bộ phận khóa chức năng

Chỉ số chỉ số của người Viking chỉ số các giá trị cột hoặc tiền tố của các giá trị cột. Ví dụ: trong bảng sau, mục nhập chỉ mục cho một hàng

CREATE INDEX part_of_name ON customer (name(10));
02 đã cho bao gồm toàn bộ giá trị
INDEX (col1 + col2, col3 - col4)
2 và tiền tố của giá trị
INDEX (col1 + col2, col3 - col4)
3 bao gồm 10 ký tự đầu tiên của nó:normal index indexes column values or prefixes of column values. For example, in the following table, the index entry for a given
CREATE INDEX part_of_name ON customer (name(10));
02 row includes the full
INDEX (col1 + col2, col3 - col4)
2 value and a prefix of the
INDEX (col1 + col2, col3 - col4)
3 value consisting of its first 10 characters:

CREATE TABLE t1 (
  col1 VARCHAR(10),
  col2 VARCHAR(20),
  INDEX (col1, col2(10))
);

MySQL 8.0.13 và hỗ trợ cao hơn các phần khóa chức năng mà các giá trị biểu thức chỉ mục thay vì các giá trị tiền tố cột hoặc cột. Việc sử dụng các phần khóa chức năng cho phép lập chỉ mục các giá trị không được lưu trữ trực tiếp trong bảng. Ví dụ:

CREATE TABLE t1 (col1 INT, col2 INT, INDEX func_index ((ABS(col1))));
CREATE INDEX idx1 ON t1 ((col1 + col2));
CREATE INDEX idx2 ON t1 ((col1 + col2), (col1 - col2), col1);
ALTER TABLE t1 ADD INDEX ((col1 * 40) DESC);

Một chỉ mục với nhiều phần chính có thể trộn các phần khóa không chức năng và chức năng.

INDEX (col1 + col2, col3 - col4)
6 và
INDEX (col1 + col2, col3 - col4)
7 được hỗ trợ cho các phần khóa chức năng.

Các phần khóa chức năng phải tuân thủ các quy tắc sau. Một lỗi xảy ra nếu một định nghĩa phần chính chứa các cấu trúc không được phép.

  • Trong các định nghĩa chỉ số, bao gồm các biểu thức trong ngoặc đơn để phân biệt chúng với các cột hoặc tiền tố cột. Ví dụ, điều này được cho phép; Các biểu thức được đặt trong khoảng dấu ngoặc đơn:

    INDEX ((col1 + col2), (col3 - col4))

    Điều này tạo ra một lỗi; Các biểu thức không được đặt trong ngoặc đơn:

    INDEX (col1 + col2, col3 - col4)
  • Một phần khóa chức năng không thể chỉ bao gồm một tên cột. Ví dụ, điều này không được phép:

    INDEX ((col1), (col2))

    Thay vào đó, hãy viết các phần chính như các phần khóa không chức năng, không có dấu ngoặc đơn:

    INDEX (col1, col2)
  • Một biểu thức phần khóa chức năng không thể tham khảo các tiền tố cột. Đối với một cách giải quyết, hãy xem cuộc thảo luận về

    CREATE INDEX part_of_name ON customer (name(10));
    07 và
    CREATE INDEX part_of_name ON customer (name(10));
    08 sau trong phần này.

  • Các bộ phận khóa chức năng không được phép trong các thông số kỹ thuật quan trọng của nước ngoài.

Đối với

CREATE INDEX part_of_name ON customer (name(10));
09, bảng đích lưu giữ các phần khóa chức năng từ bảng gốc.

Các chỉ mục chức năng được triển khai dưới dạng các cột được tạo ảo ẩn, có những hàm ý này:

  • Mỗi phần khóa chức năng được tính theo giới hạn trên tổng số cột bảng; Xem Phần & NBSP; 8.4.7, Giới hạn trên số đếm cột và kích thước hàng.

  • Các bộ phận khóa chức năng kế thừa tất cả các hạn chế áp dụng cho các cột được tạo. Ví dụ:

    • Chỉ các chức năng được phép cho các cột được tạo mới được phép cho các phần khóa chức năng.

    • Các mục tiêu con, tham số, biến, chức năng được lưu trữ và các hàm có thể tải không được phép.

    Để biết thêm thông tin về các hạn chế áp dụng, xem Phần & NBSP; 13.1.20.8, Bảng Tạo bảng và các cột được tạo, và Phần & NBSP; 13.1.9.2, Bảng thay đổi và các cột được tạo.

  • Cột được tạo ảo không yêu cầu lưu trữ. Bản thân chỉ mục chiếm không gian lưu trữ như bất kỳ chỉ mục nào khác.

CREATE INDEX part_of_name ON customer (name(10));
10 được hỗ trợ cho các chỉ mục bao gồm các phần khóa chức năng. Tuy nhiên, các khóa chính không thể bao gồm các phần khóa chức năng. Một khóa chính yêu cầu cột được tạo được lưu trữ, nhưng các phần khóa chức năng được triển khai dưới dạng các cột được tạo ảo, không được lưu trữ các cột được tạo.

Các chỉ mục

INDEX ((col1), (col2))
5 và
CREATE INDEX part_of_name ON customer (name(10));
12 không thể có các phần khóa chức năng.

Nếu một bảng không chứa khóa chính,

CREATE TABLE t1 (col1 INT, col2 INT, INDEX func_index ((ABS(col1))));
CREATE INDEX idx1 ON t1 ((col1 + col2));
CREATE INDEX idx2 ON t1 ((col1 + col2), (col1 - col2), col1);
ALTER TABLE t1 ADD INDEX ((col1 * 40) DESC);
3 sẽ tự động quảng bá chỉ mục
CREATE INDEX part_of_name ON customer (name(10));
14 đầu tiên lên khóa chính. Điều này không được hỗ trợ cho các chỉ mục
CREATE INDEX part_of_name ON customer (name(10));
15 có các phần khóa chức năng.

Các chỉ số không chức năng nêu ra một cảnh báo nếu có các chỉ mục trùng lặp. Các chỉ mục có chứa các bộ phận khóa chức năng không có tính năng này.

Để loại bỏ một cột được tham chiếu bởi một phần khóa chức năng, chỉ mục phải được xóa trước. Nếu không, một lỗi xảy ra.

Mặc dù các bộ phận khóa không chức năng hỗ trợ đặc tả độ dài tiền tố, nhưng điều này là không thể đối với các phần khóa chức năng. Giải pháp là sử dụng

CREATE INDEX part_of_name ON customer (name(10));
07 (hoặc
CREATE INDEX part_of_name ON customer (name(10));
08, như được mô tả sau trong phần này). Đối với phần khóa chức năng chứa hàm
CREATE INDEX part_of_name ON customer (name(10));
07 được sử dụng trong truy vấn, mệnh đề
CREATE INDEX part_of_name ON customer (name(10));
19 phải chứa
CREATE INDEX part_of_name ON customer (name(10));
07 với cùng một đối số. Trong ví dụ sau, chỉ có
CREATE INDEX part_of_name ON customer (name(10));
21 thứ hai có thể sử dụng chỉ mục vì đó là truy vấn duy nhất trong đó các đối số với
CREATE INDEX part_of_name ON customer (name(10));
07 khớp với đặc tả chỉ mục:

CREATE TABLE tbl (
  col1 LONGTEXT,
  INDEX idx1 ((SUBSTRING(col1, 1, 10)))
);
SELECT * FROM tbl WHERE SUBSTRING(col1, 1, 9) = '123456789';
SELECT * FROM tbl WHERE SUBSTRING(col1, 1, 10) = '1234567890';

Các phần khóa chức năng cho phép lập chỉ mục các giá trị không thể được lập chỉ mục khác, chẳng hạn như các giá trị

INDEX ((col1 + col2), (col3 - col4))
8. Tuy nhiên, điều này phải được thực hiện chính xác để đạt được hiệu ứng mong muốn. Ví dụ, cú pháp này không hoạt động:

CREATE TABLE employees (
  data JSON,
  INDEX ((data->>'$.name'))
);

Cú pháp thất bại vì:

  • Toán tử

    CREATE INDEX part_of_name ON customer (name(10));
    24 chuyển thành
    CREATE INDEX part_of_name ON customer (name(10));
    25.

  • CREATE INDEX part_of_name ON customer (name(10));
    26 Trả về một giá trị với loại dữ liệu là
    CREATE INDEX part_of_name ON customer (name(10));
    27 và cột được tạo ẩn do đó được gán cùng một loại dữ liệu.

  • MySQL không thể lập chỉ mục các cột

    CREATE INDEX part_of_name ON customer (name(10));
    27 được chỉ định mà không có độ dài tiền tố trên phần chính và độ dài tiền tố không được phép trong các phần khóa chức năng.

Để lập chỉ mục cột

INDEX ((col1 + col2), (col3 - col4))
8, bạn có thể thử sử dụng hàm
CREATE INDEX part_of_name ON customer (name(10));
08 như sau:

CREATE INDEX part_of_name ON customer (name(10));
0

Cột được tạo ẩn được gán kiểu dữ liệu

CREATE INDEX part_of_name ON customer (name(10));
31, có thể được lập chỉ mục. Nhưng phương pháp này tạo ra một vấn đề mới khi cố gắng sử dụng chỉ mục:

  • CREATE INDEX part_of_name ON customer (name(10));
    08 Trả về một chuỗi với đối chiếu
    CREATE INDEX part_of_name ON customer (name(10));
    33 (đối chiếu mặc định máy chủ).

  • CREATE INDEX part_of_name ON customer (name(10));
    26 Trả về một chuỗi với đối chiếu
    CREATE INDEX part_of_name ON customer (name(10));
    35 (mã hóa cứng).

Kết quả là, có sự không phù hợp đối chiếu giữa biểu thức được lập chỉ mục trong định nghĩa bảng trước và biểu thức mệnh đề

CREATE INDEX part_of_name ON customer (name(10));
19 trong truy vấn sau:

CREATE INDEX part_of_name ON customer (name(10));
1

Chỉ số không được sử dụng vì các biểu thức trong truy vấn và chỉ số khác nhau. Để hỗ trợ loại kịch bản này cho các bộ phận khóa chức năng, trình tối ưu hóa sẽ tự động dải

CREATE INDEX part_of_name ON customer (name(10));
08 khi tìm kiếm một chỉ mục để sử dụng, nhưng chỉ khi việc đối chiếu biểu thức được lập chỉ mục khớp với biểu thức truy vấn. Đối với một chỉ mục có phần khóa chức năng được sử dụng, một trong hai giải pháp sau đây hoạt động (mặc dù chúng khác nhau có hiệu lực):only if the collation of the indexed expression matches that of the query expression. For an index with a functional key part to be used, either of the following two solutions work (although they differ somewhat in effect):

  • Giải pháp 1. Gán biểu thức được lập chỉ mục cùng đối chiếu như

    CREATE INDEX part_of_name ON customer (name(10));
    26:

    CREATE INDEX part_of_name ON customer (name(10));
    2

    Toán tử

    CREATE INDEX part_of_name ON customer (name(10));
    24 giống như
    CREATE INDEX part_of_name ON customer (name(10));
    25 và
    CREATE INDEX part_of_name ON customer (name(10));
    26 trả về một chuỗi với đối chiếu
    CREATE INDEX part_of_name ON customer (name(10));
    35. Do đó, so sánh là nhạy cảm trường hợp và chỉ có một hàng khớp:

    CREATE INDEX part_of_name ON customer (name(10));
    3
  • Giải pháp 2. Chỉ định biểu thức đầy đủ trong truy vấn:

    CREATE INDEX part_of_name ON customer (name(10));
    4

    CREATE INDEX part_of_name ON customer (name(10));
    08 Trả về một chuỗi với đối chiếu
    CREATE INDEX part_of_name ON customer (name(10));
    33, do đó, độ nhạy của trường hợp so sánh và hai hàng khớp:

    CREATE INDEX part_of_name ON customer (name(10));
    5

Xin lưu ý rằng mặc dù trình tối ưu hóa hỗ trợ tự động tước

CREATE INDEX part_of_name ON customer (name(10));
08 với các cột được tạo được lập chỉ mục, cách tiếp cận sau không hoạt động vì nó tạo ra kết quả khác có và không có chỉ mục (Bug#27337092):

CREATE INDEX part_of_name ON customer (name(10));
6

Chỉ số độc đáo

Chỉ số

CREATE INDEX part_of_name ON customer (name(10));
10 tạo ra một ràng buộc sao cho tất cả các giá trị trong chỉ mục phải khác biệt. Lỗi xảy ra nếu bạn cố gắng thêm một hàng mới với giá trị khóa phù hợp với hàng hiện có. Nếu bạn chỉ định giá trị tiền tố cho một cột trong chỉ mục
CREATE INDEX part_of_name ON customer (name(10));
10, các giá trị cột phải là duy nhất trong độ dài tiền tố. Chỉ số
CREATE INDEX part_of_name ON customer (name(10));
10 cho phép nhiều giá trị
CREATE INDEX part_of_name ON customer (name(10));
49 cho các cột có thể chứa
CREATE INDEX part_of_name ON customer (name(10));
49.

Nếu một bảng có chỉ số

CREATE TABLE t1 (col1 INT, col2 INT, INDEX func_index ((ABS(col1))));
CREATE INDEX idx1 ON t1 ((col1 + col2));
CREATE INDEX idx2 ON t1 ((col1 + col2), (col1 - col2), col1);
ALTER TABLE t1 ADD INDEX ((col1 * 40) DESC);
8 hoặc
CREATE INDEX part_of_name ON customer (name(10));
15 bao gồm một cột duy nhất có loại số nguyên, bạn có thể sử dụng
CREATE INDEX part_of_name ON customer (name(10));
53 để tham khảo cột được lập chỉ mục trong các câu lệnh
CREATE INDEX part_of_name ON customer (name(10));
21, như sau:

  • CREATE INDEX part_of_name ON customer (name(10));
    53 đề cập đến cột
    CREATE INDEX part_of_name ON customer (name(10));
    56 nếu có
    CREATE INDEX part_of_name ON customer (name(10));
    56 bao gồm một cột số nguyên duy nhất. Nếu có
    CREATE TABLE t1 (col1 INT, col2 INT, INDEX func_index ((ABS(col1))));
    CREATE INDEX idx1 ON t1 ((col1 + col2));
    CREATE INDEX idx2 ON t1 ((col1 + col2), (col1 - col2), col1);
    ALTER TABLE t1 ADD INDEX ((col1 * 40) DESC);
    8 nhưng nó không bao gồm một cột số nguyên duy nhất,
    CREATE INDEX part_of_name ON customer (name(10));
    53 không thể được sử dụng.

  • Mặt khác,

    CREATE INDEX part_of_name ON customer (name(10));
    53 đề cập đến cột trong chỉ số
    CREATE INDEX part_of_name ON customer (name(10));
    15 đầu tiên nếu chỉ mục đó bao gồm một cột số nguyên duy nhất. Nếu chỉ số
    CREATE INDEX part_of_name ON customer (name(10));
    15 đầu tiên không bao gồm một cột số nguyên duy nhất,
    CREATE INDEX part_of_name ON customer (name(10));
    53 không thể được sử dụng.

Chỉ số đa giá trị

Kể từ MySQL 8.0.17,

CREATE TABLE t1 (col1 INT, col2 INT, INDEX func_index ((ABS(col1))));
CREATE INDEX idx1 ON t1 ((col1 + col2));
CREATE INDEX idx2 ON t1 ((col1 + col2), (col1 - col2), col1);
ALTER TABLE t1 ADD INDEX ((col1 * 40) DESC);
3 hỗ trợ các chỉ mục đa giá trị. Chỉ mục đa giá trị là một chỉ mục thứ cấp được xác định trên một cột lưu trữ một mảng các giá trị. Một chỉ số bình thường của người Viking có một bản ghi chỉ số cho mỗi bản ghi dữ liệu (1: 1). Một chỉ mục đa giá trị có thể có nhiều bản ghi chỉ mục cho một bản ghi dữ liệu duy nhất (n: 1). Các chỉ mục đa giá trị được dự định để lập chỉ mục các mảng
INDEX ((col1 + col2), (col3 - col4))
8. Ví dụ: một chỉ mục đa giá trị được xác định trên mảng mã zip trong tài liệu JSON sau đây tạo một bản ghi chỉ mục cho mỗi mã zip, với mỗi bản ghi chỉ mục tham chiếu cùng một bản ghi dữ liệu.normal index has one index record for each data record (1:1). A multi-valued index can have multiple index records for a single data record (N:1). Multi-valued indexes are intended for indexing
INDEX ((col1 + col2), (col3 - col4))
8 arrays. For example, a multi-valued index defined on the array of zip codes in the following JSON document creates an index record for each zip code, with each index record referencing the same data record.

CREATE INDEX part_of_name ON customer (name(10));
7
Tạo các chỉ mục đa giá trị

Bạn có thể tạo một chỉ mục đa giá trị trong câu lệnh

CREATE INDEX part_of_name ON customer (name(10));
66,
CREATE TABLE t1 (col1 INT, col2 INT, INDEX func_index ((ABS(col1))));
CREATE INDEX idx1 ON t1 ((col1 + col2));
CREATE INDEX idx2 ON t1 ((col1 + col2), (col1 - col2), col1);
ALTER TABLE t1 ADD INDEX ((col1 * 40) DESC);
6 hoặc
CREATE TABLE t1 (col1 INT, col2 INT, INDEX func_index ((ABS(col1))));
CREATE INDEX idx1 ON t1 ((col1 + col2));
CREATE INDEX idx2 ON t1 ((col1 + col2), (col1 - col2), col1);
ALTER TABLE t1 ADD INDEX ((col1 * 40) DESC);
4. Điều này yêu cầu sử dụng
CREATE INDEX part_of_name ON customer (name(10));
69 trong định nghĩa chỉ số, đưa ra các giá trị vô hướng được gõ bằng một mảng
INDEX ((col1 + col2), (col3 - col4))
8 vào mảng kiểu dữ liệu SQL. Một cột ảo sau đó được tạo trong suốt với các giá trị trong mảng kiểu dữ liệu SQL; Cuối cùng, một chỉ mục chức năng (còn được gọi là chỉ mục ảo) được tạo trên cột ảo. Đây là chỉ mục chức năng được xác định trên cột ảo của các giá trị từ mảng kiểu dữ liệu SQL tạo thành chỉ mục đa giá trị.

Các ví dụ trong danh sách sau đây cho thấy ba cách khác nhau trong đó chỉ mục đa giá trị

CREATE INDEX part_of_name ON customer (name(10));
71 có thể được tạo trên một mảng
CREATE INDEX part_of_name ON customer (name(10));
72 trên cột
INDEX ((col1 + col2), (col3 - col4))
8
CREATE INDEX part_of_name ON customer (name(10));
74 trong một bảng có tên
CREATE INDEX part_of_name ON customer (name(10));
75. Trong mỗi trường hợp, mảng JSON được chuyển vào một mảng kiểu dữ liệu SQL của các giá trị số nguyên
CREATE INDEX part_of_name ON customer (name(10));
76.

  • CREATE INDEX part_of_name ON customer (name(10));
    66 chỉ:

    CREATE INDEX part_of_name ON customer (name(10));
    8
  • CREATE INDEX part_of_name ON customer (name(10));
    66 cộng với
    CREATE INDEX part_of_name ON customer (name(10));
    79:

    CREATE INDEX part_of_name ON customer (name(10));
    9
  • CREATE INDEX part_of_name ON customer (name(10));
    66 cộng với
    CREATE INDEX part_of_name ON customer (name(10));
    81:

    CREATE TABLE t1 (
      col1 VARCHAR(10),
      col2 VARCHAR(20),
      INDEX (col1, col2(10))
    );
    0

Một chỉ số đa giá trị cũng có thể được định nghĩa là một phần của chỉ số tổng hợp. Ví dụ này cho thấy một chỉ số tổng hợp bao gồm hai phần có giá trị đơn (cho các cột

CREATE INDEX part_of_name ON customer (name(10));
82 và
CREATE INDEX part_of_name ON customer (name(10));
83) và một phần đa giá trị (cho cột
CREATE INDEX part_of_name ON customer (name(10));
74):

CREATE TABLE t1 (
  col1 VARCHAR(10),
  col2 VARCHAR(20),
  INDEX (col1, col2(10))
);
1

Chỉ có thể sử dụng một phần khóa đa giá trị có thể được sử dụng trong một chỉ số tổng hợp. Phần khóa đa giá trị có thể được sử dụng theo bất kỳ thứ tự nào so với các phần khác của khóa. Nói cách khác, câu lệnh

CREATE INDEX part_of_name ON customer (name(10));
85 vừa được hiển thị có thể đã sử dụng
CREATE INDEX part_of_name ON customer (name(10));
86 (hoặc bất kỳ thứ tự nào khác) và vẫn còn hợp lệ.

Sử dụng các chỉ mục đa giá trị

Trình tối ưu hóa sử dụng chỉ mục đa giá trị để tìm nạp các bản ghi khi các chức năng sau được chỉ định trong mệnh đề

CREATE INDEX part_of_name ON customer (name(10));
19:

  • CREATE INDEX part_of_name ON customer (name(10));
    88

  • CREATE INDEX part_of_name ON customer (name(10));
    89

  • CREATE INDEX part_of_name ON customer (name(10));
    90

Chúng ta có thể chứng minh điều này bằng cách tạo và điền vào bảng

CREATE INDEX part_of_name ON customer (name(10));
75 bằng cách sử dụng các câu lệnh
CREATE INDEX part_of_name ON customer (name(10));
66 và
CREATE INDEX part_of_name ON customer (name(10));
01 sau:

CREATE TABLE t1 (
  col1 VARCHAR(10),
  col2 VARCHAR(20),
  INDEX (col1, col2(10))
);
2

Đầu tiên, chúng tôi thực thi ba truy vấn trên bảng

CREATE INDEX part_of_name ON customer (name(10));
75, mỗi truy cập sử dụng
CREATE INDEX part_of_name ON customer (name(10));
88,
CREATE INDEX part_of_name ON customer (name(10));
89 và
CREATE INDEX part_of_name ON customer (name(10));
90, với kết quả từ mỗi truy vấn được hiển thị ở đây:

CREATE TABLE t1 (
  col1 VARCHAR(10),
  col2 VARCHAR(20),
  INDEX (col1, col2(10))
);
3

Tiếp theo, chúng tôi chạy

CREATE INDEX part_of_name ON customer (name(10));
98 trên mỗi ba truy vấn trước đó:

CREATE TABLE t1 (
  col1 VARCHAR(10),
  col2 VARCHAR(20),
  INDEX (col1, col2(10))
);
4

Không ai trong ba truy vấn chỉ hiển thị có thể sử dụng bất kỳ khóa nào. Để giải quyết vấn đề này, chúng tôi có thể thêm một chỉ mục đa giá trị trên mảng

CREATE INDEX part_of_name ON customer (name(10));
99 trong cột
INDEX ((col1 + col2), (col3 - col4))
8 (
CREATE INDEX part_of_name ON customer (name(10));
74), như thế này:

CREATE TABLE t1 (
  col1 VARCHAR(10),
  col2 VARCHAR(20),
  INDEX (col1, col2(10))
);
5

Khi chúng tôi chạy lại các câu lệnh

CREATE INDEX part_of_name ON customer (name(10));
98 trước đó, giờ đây chúng tôi có thể quan sát rằng các truy vấn có thể (và làm) sử dụng chỉ mục
CREATE INDEX part_of_name ON customer (name(10));
71 vừa được tạo:

CREATE TABLE t1 (
  col1 VARCHAR(10),
  col2 VARCHAR(20),
  INDEX (col1, col2(10))
);
6

Một chỉ mục đa giá trị có thể được định nghĩa là một khóa duy nhất. Nếu được xác định là một khóa duy nhất, cố gắng chèn một giá trị đã có trong chỉ mục đa giá trị trả về một lỗi khóa trùng lặp. Nếu các giá trị trùng lặp đã có mặt, cố gắng thêm một chỉ mục đa giá trị duy nhất không thành công, như được hiển thị ở đây:

CREATE TABLE t1 (
  col1 VARCHAR(10),
  col2 VARCHAR(20),
  INDEX (col1, col2(10))
);
7
Đặc điểm của các chỉ mục đa giá trị

Các chỉ mục đa giá trị có các đặc điểm bổ sung được liệt kê ở đây:

  • Các hoạt động DML ảnh hưởng đến các chỉ mục đa giá trị được xử lý theo cách tương tự như các hoạt động DML ảnh hưởng đến chỉ số bình thường, với sự khác biệt duy nhất là có thể có nhiều hơn một lần chèn hoặc cập nhật cho một bản ghi chỉ mục phân cụm duy nhất.

  • Khả năng vô tính và các chỉ mục đa giá trị:

    • Nếu phần khóa đa giá trị có một mảng trống, không có mục nào được thêm vào chỉ mục và bản ghi dữ liệu không thể truy cập được bằng cách quét chỉ mục.

    • Nếu thế hệ phần khóa đa giá trị trả về giá trị

      CREATE INDEX part_of_name ON customer (name(10));
      49, một mục nhập duy nhất chứa
      CREATE INDEX part_of_name ON customer (name(10));
      49 sẽ được thêm vào chỉ mục đa giá trị. Nếu phần chính được định nghĩa là
      CREATE TABLE t1 (
        col1 VARCHAR(10),
        col2 VARCHAR(20),
        INDEX (col1, col2(10))
      );
      06, một lỗi được báo cáo.

    • Nếu cột mảng gõ được đặt thành

      CREATE INDEX part_of_name ON customer (name(10));
      49, công cụ lưu trữ sẽ lưu trữ một bản ghi duy nhất chứa
      CREATE INDEX part_of_name ON customer (name(10));
      49 trỏ đến bản ghi dữ liệu.

    • INDEX ((col1 + col2), (col3 - col4))
      8 Các giá trị NULL không được phép trong các mảng được lập chỉ mục. Nếu bất kỳ giá trị trả về nào là
      CREATE INDEX part_of_name ON customer (name(10));
      49, nó được coi là một null JSON và lỗi giá trị JSON không hợp lệ được báo cáo.Invalid JSON value error is reported.

  • Bởi vì các chỉ mục đa giá trị là các chỉ mục ảo trên các cột ảo, chúng phải tuân thủ các quy tắc giống như các chỉ mục thứ cấp trên các cột được tạo ảo.

  • Hồ sơ chỉ số không được thêm vào cho các mảng trống.

Hạn chế và hạn chế đối với các chỉ mục đa giá trị

Các chỉ mục đa giá trị phải tuân theo các hạn chế và hạn chế được liệt kê ở đây:

  • Chỉ được phép một phần khóa đa giá trị được cho phép trên mỗi chỉ mục đa giá trị. Tuy nhiên, biểu thức

    CREATE TABLE t1 (
      col1 VARCHAR(10),
      col2 VARCHAR(20),
      INDEX (col1, col2(10))
    );
    11 có thể tham khảo nhiều mảng trong tài liệu
    INDEX ((col1 + col2), (col3 - col4))
    8, như được hiển thị ở đây:

    CREATE TABLE t1 (
      col1 VARCHAR(10),
      col2 VARCHAR(20),
      INDEX (col1, col2(10))
    );
    8

    Trong trường hợp này, tất cả các giá trị khớp với biểu thức JSON được lưu trữ trong chỉ mục dưới dạng một mảng phẳng duy nhất.

  • Một chỉ mục có phần khóa đa giá trị không hỗ trợ đặt hàng và do đó không thể được sử dụng làm khóa chính. Vì lý do tương tự, một chỉ mục đa giá trị không thể được xác định bằng cách sử dụng từ khóa

    INDEX (col1 + col2, col3 - col4)
    6 hoặc
    INDEX (col1 + col2, col3 - col4)
    7.

  • Một chỉ mục đa giá trị không thể là một chỉ mục bảo hiểm.

  • Số lượng giá trị tối đa cho mỗi bản ghi cho một chỉ số đa giá trị được xác định bởi lượng dữ liệu có thể được lưu trữ trên một trang nhật ký hoàn tác, là 65221 byte (64K trừ 315 byte cho chi phí Độ dài của các giá trị chính cũng là 65221 byte. Số lượng phím tối đa phụ thuộc vào các yếu tố khác nhau, ngăn chặn việc xác định giới hạn cụ thể. Các thử nghiệm đã chỉ ra một chỉ số đa giá trị để cho phép có tới 1604 khóa số nguyên cho mỗi bản ghi, ví dụ. Khi đạt đến giới hạn, một lỗi tương tự như sau được báo cáo: Lỗi 3905 (HY000): vượt quá số lượng giá trị tối đa trên mỗi bản ghi cho chỉ mục đa giá trị 'IDX' bằng 1 giá trị.ERROR 3905 (HY000): Exceeded max number of values per record for multi-valued index 'idx' by 1 value(s).

  • Loại biểu thức duy nhất được phép trong một phần khóa đa giá trị là biểu thức

    INDEX ((col1 + col2), (col3 - col4))
    8. Biểu thức không cần tham khảo một phần tử hiện có trong tài liệu JSON được chèn vào cột được lập chỉ mục, mà phải tự mình có hiệu lực về mặt cú pháp.

  • Bởi vì các bản ghi chỉ mục cho cùng một bản ghi chỉ mục được phân phối được phân tán trong toàn bộ chỉ mục đa giá trị, nên chỉ mục đa giá trị không hỗ trợ quét phạm vi hoặc quét chỉ có chỉ mục.

  • Các chỉ mục đa giá trị không được phép trong các thông số kỹ thuật quan trọng của nước ngoài.

  • Tiền tố chỉ mục không thể được xác định cho các chỉ mục đa giá trị.

  • Các chỉ mục đa giá trị không thể được xác định trên dữ liệu được đúc là

    INDEX (col1, col2)
    1 (xem mô tả của hàm
    CREATE INDEX part_of_name ON customer (name(10));
    08).

  • Việc tạo trực tuyến một chỉ số đa giá trị không được hỗ trợ, điều đó có nghĩa là hoạt động sử dụng

    CREATE TABLE t1 (
      col1 VARCHAR(10),
      col2 VARCHAR(20),
      INDEX (col1, col2(10))
    );
    18. Xem các yêu cầu về hiệu suất và không gian.

  • Các bộ ký tự và đối chiếu khác với hai kết hợp sau của bộ ký tự và đối chiếu không được hỗ trợ cho các chỉ mục đa giá trị:

    1. Ký tự

      CREATE TABLE t1 (
        col1 VARCHAR(10),
        col2 VARCHAR(20),
        INDEX (col1, col2(10))
      );
      19 được đặt với bộ đối chiếu
      CREATE TABLE t1 (
        col1 VARCHAR(10),
        col2 VARCHAR(20),
        INDEX (col1, col2(10))
      );
      19 mặc định

    2. Ký tự

      CREATE TABLE t1 (
        col1 VARCHAR(10),
        col2 VARCHAR(20),
        INDEX (col1, col2(10))
      );
      21 được đặt với đối chiếu
      CREATE TABLE t1 (
        col1 VARCHAR(10),
        col2 VARCHAR(20),
        INDEX (col1, col2(10))
      );
      22 mặc định.

  • Cũng như các chỉ mục khác trên các cột của bảng

    CREATE TABLE t1 (col1 INT, col2 INT, INDEX func_index ((ABS(col1))));
    CREATE INDEX idx1 ON t1 ((col1 + col2));
    CREATE INDEX idx2 ON t1 ((col1 + col2), (col1 - col2), col1);
    ALTER TABLE t1 ADD INDEX ((col1 * 40) DESC);
    3, một chỉ mục đa giá trị không thể được tạo bằng
    CREATE TABLE t1 (
      col1 VARCHAR(10),
      col2 VARCHAR(20),
      INDEX (col1, col2(10))
    );
    24; Cố gắng thực hiện như vậy dẫn đến cảnh báo: Công cụ lưu trữ này không hỗ trợ thuật toán chỉ mục băm, mặc định công cụ lưu trữ đã được sử dụng thay thế. (
    CREATE TABLE t1 (
      col1 VARCHAR(10),
      col2 VARCHAR(20),
      INDEX (col1, col2(10))
    );
    25 được hỗ trợ như bình thường.)This storage engine does not support the HASH index algorithm, storage engine default was used instead. (
    CREATE TABLE t1 (
      col1 VARCHAR(10),
      col2 VARCHAR(20),
      INDEX (col1, col2(10))
    );
    25 is supported as usual.)

Chỉ số không gian

Các công cụ lưu trữ

INDEX (col1, col2)
8,
CREATE TABLE t1 (col1 INT, col2 INT, INDEX func_index ((ABS(col1))));
CREATE INDEX idx1 ON t1 ((col1 + col2));
CREATE INDEX idx2 ON t1 ((col1 + col2), (col1 - col2), col1);
ALTER TABLE t1 ADD INDEX ((col1 * 40) DESC);
3,
CREATE TABLE employees (
  data JSON,
  INDEX ((data->>'$.name'))
);
6 và
CREATE TABLE t1 (
  col1 VARCHAR(10),
  col2 VARCHAR(20),
  INDEX (col1, col2(10))
);
29 hỗ trợ các cột không gian như
CREATE TABLE t1 (
  col1 VARCHAR(10),
  col2 VARCHAR(20),
  INDEX (col1, col2(10))
);
30 và
CREATE TABLE t1 (
  col1 VARCHAR(10),
  col2 VARCHAR(20),
  INDEX (col1, col2(10))
);
31. . Các chỉ số không gian và không thường xuyên trên các cột không gian có sẵn theo các quy tắc sau.

Các chỉ mục không gian trên các cột không gian có các đặc điểm này:

  • Chỉ có sẵn cho bảng

    CREATE TABLE t1 (col1 INT, col2 INT, INDEX func_index ((ABS(col1))));
    CREATE INDEX idx1 ON t1 ((col1 + col2));
    CREATE INDEX idx2 ON t1 ((col1 + col2), (col1 - col2), col1);
    ALTER TABLE t1 ADD INDEX ((col1 * 40) DESC);
    3 và
    INDEX (col1, col2)
    8. Chỉ định
    CREATE TABLE t1 (
      col1 VARCHAR(10),
      col2 VARCHAR(20),
      INDEX (col1, col2(10))
    );
    34 cho các công cụ lưu trữ khác dẫn đến lỗi.

  • Kể từ MySQL 8.0.12, một chỉ mục trên cột không gian phải là chỉ số

    INDEX ((col1), (col2))
    5. Do đó, từ khóa
    INDEX ((col1), (col2))
    5 là tùy chọn nhưng tiềm ẩn để tạo một chỉ mục trên một cột không gian.must be a
    INDEX ((col1), (col2))
    5 index. The
    INDEX ((col1), (col2))
    5 keyword is thus optional but implicit for creating an index on a spatial column.

  • Chỉ có sẵn cho các cột không gian duy nhất. Một chỉ số không gian không thể được tạo ra trên nhiều cột không gian.

  • Các cột được lập chỉ mục phải là

    CREATE TABLE t1 (
      col1 VARCHAR(10),
      col2 VARCHAR(20),
      INDEX (col1, col2(10))
    );
    37.

  • Độ dài tiền tố cột bị cấm. Độ rộng đầy đủ của mỗi cột được lập chỉ mục.

  • Không được phép cho một khóa chính hoặc chỉ mục duy nhất.

Các chỉ mục không có ngữ trên các cột không gian (được tạo bằng

CREATE TABLE t1 (
  col1 VARCHAR(10),
  col2 VARCHAR(20),
  INDEX (col1, col2(10))
);
38,
CREATE INDEX part_of_name ON customer (name(10));
10 hoặc
CREATE TABLE t1 (col1 INT, col2 INT, INDEX func_index ((ABS(col1))));
CREATE INDEX idx1 ON t1 ((col1 + col2));
CREATE INDEX idx2 ON t1 ((col1 + col2), (col1 - col2), col1);
ALTER TABLE t1 ADD INDEX ((col1 * 40) DESC);
8) có những đặc điểm này:

  • Được phép cho bất kỳ công cụ lưu trữ nào hỗ trợ các cột không gian ngoại trừ

    CREATE TABLE t1 (
      col1 VARCHAR(10),
      col2 VARCHAR(20),
      INDEX (col1, col2(10))
    );
    29.

  • Các cột có thể là

    CREATE INDEX part_of_name ON customer (name(10));
    49 trừ khi chỉ mục là khóa chính.

  • Loại chỉ mục cho một chỉ số không phải là -____ ____ 65 phụ thuộc vào công cụ lưu trữ. Hiện tại, cây B được sử dụng.

  • Được phép cho một cột có thể có giá trị

    CREATE INDEX part_of_name ON customer (name(10));
    49 chỉ cho các bảng
    CREATE TABLE t1 (col1 INT, col2 INT, INDEX func_index ((ABS(col1))));
    CREATE INDEX idx1 ON t1 ((col1 + col2));
    CREATE INDEX idx2 ON t1 ((col1 + col2), (col1 - col2), col1);
    ALTER TABLE t1 ADD INDEX ((col1 * 40) DESC);
    3,
    INDEX (col1, col2)
    8 và
    CREATE TABLE t1 (
      col1 VARCHAR(10),
      col2 VARCHAR(20),
      INDEX (col1, col2(10))
    );
    47.

Tùy chọn chỉ mục

Theo danh sách phần chính, các tùy chọn chỉ mục có thể được đưa ra. Giá trị

CREATE TABLE t1 (
  col1 VARCHAR(10),
  col2 VARCHAR(20),
  INDEX (col1, col2(10))
);
48 có thể là bất kỳ điều nào sau đây:

  • CREATE TABLE t1 (
      col1 VARCHAR(10),
      col2 VARCHAR(20),
      INDEX (col1, col2(10))
    );
    49

    Đối với các bảng

    INDEX (col1, col2)
    8,
    CREATE TABLE t1 (
      col1 VARCHAR(10),
      col2 VARCHAR(20),
      INDEX (col1, col2(10))
    );
    51 Tùy chọn chỉ định kích thước tính bằng byte để sử dụng cho các khối khóa chỉ mục. Giá trị được coi là một gợi ý; Một kích thước khác nhau có thể được sử dụng nếu cần thiết. Giá trị
    CREATE TABLE t1 (
      col1 VARCHAR(10),
      col2 VARCHAR(20),
      INDEX (col1, col2(10))
    );
    51 được chỉ định cho một định nghĩa chỉ số riêng lẻ ghi đè giá trị cấp bảng
    CREATE TABLE t1 (
      col1 VARCHAR(10),
      col2 VARCHAR(20),
      INDEX (col1, col2(10))
    );
    51.

    CREATE TABLE t1 (
      col1 VARCHAR(10),
      col2 VARCHAR(20),
      INDEX (col1, col2(10))
    );
    51 không được hỗ trợ ở cấp chỉ mục cho các bảng
    CREATE TABLE t1 (col1 INT, col2 INT, INDEX func_index ((ABS(col1))));
    CREATE INDEX idx1 ON t1 ((col1 + col2));
    CREATE INDEX idx2 ON t1 ((col1 + col2), (col1 - col2), col1);
    ALTER TABLE t1 ADD INDEX ((col1 * 40) DESC);
    3. Xem Phần & NBSP; 13.1.20, Tuyên bố Tạo bảng.

  • CREATE TABLE t1 (
      col1 VARCHAR(10),
      col2 VARCHAR(20),
      INDEX (col1, col2(10))
    );
    56

    Một số công cụ lưu trữ cho phép bạn chỉ định loại chỉ mục khi tạo một chỉ mục. Ví dụ:

    CREATE TABLE t1 (
      col1 VARCHAR(10),
      col2 VARCHAR(20),
      INDEX (col1, col2(10))
    );
    9

    Bảng & NBSP; 13.1, Các loại chỉ mục trên mỗi công cụ lưu trữ, hiển thị các giá trị loại chỉ mục cho phép được hỗ trợ bởi các công cụ lưu trữ khác nhau. Trong trường hợp nhiều loại chỉ mục được liệt kê, loại đầu tiên là mặc định khi không có nhà xác định loại chỉ mục nào được đưa ra. Các công cụ lưu trữ không được liệt kê trong bảng không hỗ trợ mệnh đề

    CREATE TABLE t1 (
      col1 VARCHAR(10),
      col2 VARCHAR(20),
      INDEX (col1, col2(10))
    );
    56 trong các định nghĩa chỉ số.

    Bảng & NBSP; 13.1 & NBSP; Các loại chỉ mục trên mỗi công cụ lưu trữ

    Công cụ lưu trữCác loại chỉ mục cho phép
    CREATE TABLE t1 (col1 INT, col2 INT, INDEX func_index ((ABS(col1))));
    CREATE INDEX idx1 ON t1 ((col1 + col2));
    CREATE INDEX idx2 ON t1 ((col1 + col2), (col1 - col2), col1);
    ALTER TABLE t1 ADD INDEX ((col1 * 40) DESC);
    3
    CREATE TABLE t1 (
      col1 VARCHAR(10),
      col2 VARCHAR(20),
      INDEX (col1, col2(10))
    );
    59
    INDEX (col1, col2)
    8
    CREATE TABLE t1 (
      col1 VARCHAR(10),
      col2 VARCHAR(20),
      INDEX (col1, col2(10))
    );
    59
    INDEX (col1, col2)
    8
    ________ 247/________ 263
    INDEX ((col1), (col2))
    0,
    CREATE TABLE t1 (
      col1 VARCHAR(10),
      col2 VARCHAR(20),
      INDEX (col1, col2(10))
    );
    59
    CREATE TABLE employees (
      data JSON,
      INDEX ((data->>'$.name'))
    );
    6

    INDEX ((col1), (col2))
    0,
    CREATE TABLE t1 (
      col1 VARCHAR(10),
      col2 VARCHAR(20),
      INDEX (col1, col2(10))
    );
    59 (xem ghi chú trong văn bản)

    Điều khoản

    CREATE TABLE t1 (
      col1 VARCHAR(10),
      col2 VARCHAR(20),
      INDEX (col1, col2(10))
    );
    56 không thể được sử dụng cho
    CREATE TABLE t1 (
      col1 VARCHAR(10),
      col2 VARCHAR(20),
      INDEX (col1, col2(10))
    );
    70 hoặc (trước thông số kỹ thuật của MySQL 8.0.12)
    CREATE TABLE t1 (
      col1 VARCHAR(10),
      col2 VARCHAR(20),
      INDEX (col1, col2(10))
    );
    34. Thực hiện chỉ số toàn văn là phụ thuộc vào công cụ lưu trữ. Các chỉ số không gian được thực hiện dưới dạng chỉ số r-cây.

    Nếu bạn chỉ định một loại chỉ mục không hợp lệ cho một công cụ lưu trữ nhất định, nhưng loại chỉ mục khác có sẵn mà động cơ có thể sử dụng mà không ảnh hưởng đến kết quả truy vấn, động cơ sử dụng loại có sẵn. Trình phân tích cú pháp nhận ra

    CREATE TABLE t1 (
      col1 VARCHAR(10),
      col2 VARCHAR(20),
      INDEX (col1, col2(10))
    );
    72 là tên loại. Kể từ MySQL 8.0.12, điều này chỉ được phép đối với các chỉ mục
    INDEX ((col1), (col2))
    5. Trước 8.0.12,
    CREATE TABLE t1 (
      col1 VARCHAR(10),
      col2 VARCHAR(20),
      INDEX (col1, col2(10))
    );
    72 không thể được chỉ định cho bất kỳ công cụ lưu trữ nào.

    Các chỉ mục

    CREATE TABLE t1 (
      col1 VARCHAR(10),
      col2 VARCHAR(20),
      INDEX (col1, col2(10))
    );
    59 được thực hiện bởi công cụ lưu trữ
    CREATE TABLE employees (
      data JSON,
      INDEX ((data->>'$.name'))
    );
    6 dưới dạng chỉ mục T-Tree.

    Ghi chú

    Đối với các chỉ mục duy nhất bao gồm một hoặc nhiều cột

    CREATE INDEX part_of_name ON customer (name(10));
    49 của bảng
    CREATE TABLE employees (
      data JSON,
      INDEX ((data->>'$.name'))
    );
    6, chỉ số băm chỉ có thể được sử dụng để tra cứu các giá trị theo nghĩa đen, điều đó có nghĩa là các điều kiện
    CREATE TABLE t1 (
      col1 VARCHAR(10),
      col2 VARCHAR(20),
      INDEX (col1, col2(10))
    );
    83 yêu cầu quét toàn bộ bảng. Một cách giải quyết là đảm bảo rằng một chỉ mục duy nhất sử dụng một hoặc nhiều cột
    CREATE INDEX part_of_name ON customer (name(10));
    49 trên bảng như vậy luôn được tạo theo cách mà nó bao gồm chỉ mục được đặt hàng; nghĩa là, tránh sử dụng
    CREATE TABLE t1 (
      col1 VARCHAR(10),
      col2 VARCHAR(20),
      INDEX (col1, col2(10))
    );
    24 khi tạo chỉ mục.

    Nếu bạn chỉ định một loại chỉ mục không hợp lệ cho một công cụ lưu trữ nhất định, nhưng loại chỉ mục khác có sẵn mà động cơ có thể sử dụng mà không ảnh hưởng đến kết quả truy vấn, động cơ sử dụng loại có sẵn. Trình phân tích cú pháp nhận ra

    CREATE TABLE t1 (
      col1 VARCHAR(10),
      col2 VARCHAR(20),
      INDEX (col1, col2(10))
    );
    72 là tên loại, nhưng hiện tại không thể chỉ định cho bất kỳ công cụ lưu trữ nào.

    Ghi chú

    Việc sử dụng tùy chọn

    CREATE TABLE t1 (
      col1 VARCHAR(10),
      col2 VARCHAR(20),
      INDEX (col1, col2(10))
    );
    56 trước mệnh đề
    CREATE TABLE t1 (
      col1 VARCHAR(10),
      col2 VARCHAR(20),
      INDEX (col1, col2(10))
    );
    88 bị phản đối; Mong đợi hỗ trợ sử dụng tùy chọn ở vị trí này sẽ bị xóa trong bản phát hành MySQL trong tương lai. Nếu tùy chọn
    CREATE TABLE t1 (
      col1 VARCHAR(10),
      col2 VARCHAR(20),
      INDEX (col1, col2(10))
    );
    56 được đưa ra ở cả vị trí trước đó và sau đó, tùy chọn cuối cùng được áp dụng.

    CREATE TABLE t1 (
      col1 VARCHAR(10),
      col2 VARCHAR(20),
      INDEX (col1, col2(10))
    );
    90 được công nhận là từ đồng nghĩa với
    CREATE TABLE t1 (
      col1 VARCHAR(10),
      col2 VARCHAR(20),
      INDEX (col1, col2(10))
    );
    91. Tuy nhiên,
    CREATE TABLE t1 (
      col1 VARCHAR(10),
      col2 VARCHAR(20),
      INDEX (col1, col2(10))
    );
    78 là hình thức ưa thích.

    Các bảng sau đây hiển thị các đặc điểm chỉ mục cho các công cụ lưu trữ hỗ trợ tùy chọn

    CREATE TABLE t1 (
      col1 VARCHAR(10),
      col2 VARCHAR(20),
      INDEX (col1, col2(10))
    );
    56.

    Bảng & NBSP; 13.2 & NBSP; Đặc điểm chỉ số công cụ lưu trữ Innodb

    Lớp chỉ mụcLoại chỉ mụcLưu trữ giá trị nullCho phép nhiều giá trị nullLà loại quét nullKhông phải là loại quét null
    Khóa chính
    CREATE TABLE t1 (
      col1 VARCHAR(10),
      col2 VARCHAR(20),
      INDEX (col1, col2(10))
    );
    59
    KhôngKhôngN/aN/a
    Độc nhất
    CREATE TABLE t1 (
      col1 VARCHAR(10),
      col2 VARCHAR(20),
      INDEX (col1, col2(10))
    );
    59
    KhôngKhôngN/aN/a
    Độc nhất
    CREATE TABLE t1 (
      col1 VARCHAR(10),
      col2 VARCHAR(20),
      INDEX (col1, col2(10))
    );
    59
    KhôngKhôngN/aN/a
    CREATE INDEX part_of_name ON customer (name(10));
    12
    N/aKhôngKhôngN/aN/a
    INDEX ((col1), (col2))
    5
    N/aKhôngKhôngN/aN/a


    Độc nhất

    Lớp chỉ mụcLoại chỉ mụcLưu trữ giá trị nullCho phép nhiều giá trị nullLà loại quét nullKhông phải là loại quét null
    Khóa chính
    CREATE TABLE t1 (
      col1 VARCHAR(10),
      col2 VARCHAR(20),
      INDEX (col1, col2(10))
    );
    59
    KhôngKhôngN/aN/a
    Độc nhất
    CREATE TABLE t1 (
      col1 VARCHAR(10),
      col2 VARCHAR(20),
      INDEX (col1, col2(10))
    );
    59
    KhôngKhôngN/aN/a
    Độc nhất
    CREATE TABLE t1 (
      col1 VARCHAR(10),
      col2 VARCHAR(20),
      INDEX (col1, col2(10))
    );
    59
    KhôngKhôngN/aN/a
    CREATE INDEX part_of_name ON customer (name(10));
    12
    N/aKhôngKhôngN/aN/a
    INDEX ((col1), (col2))
    5
    N/aKhôngKhôngN/aN/a


    Độc nhất

    Lớp chỉ mụcLoại chỉ mụcLưu trữ giá trị nullCho phép nhiều giá trị nullLà loại quét nullKhông phải là loại quét null
    Khóa chính
    CREATE TABLE t1 (
      col1 VARCHAR(10),
      col2 VARCHAR(20),
      INDEX (col1, col2(10))
    );
    59
    KhôngKhôngN/aN/a
    Độc nhất
    CREATE TABLE t1 (
      col1 VARCHAR(10),
      col2 VARCHAR(20),
      INDEX (col1, col2(10))
    );
    59
    KhôngKhôngN/aN/a
    Độc nhất
    CREATE TABLE t1 (
      col1 VARCHAR(10),
      col2 VARCHAR(20),
      INDEX (col1, col2(10))
    );
    59
    KhôngKhôngN/aN/a
    Khóa chính
    CREATE TABLE t1 (
      col1 VARCHAR(10),
      col2 VARCHAR(20),
      INDEX (col1, col2(10))
    );
    59
    KhôngKhôngN/aN/a
    Độc nhất
    CREATE TABLE t1 (
      col1 VARCHAR(10),
      col2 VARCHAR(20),
      INDEX (col1, col2(10))
    );
    59
    KhôngKhôngN/aN/a
    Độc nhất
    CREATE TABLE t1 (
      col1 VARCHAR(10),
      col2 VARCHAR(20),
      INDEX (col1, col2(10))
    );
    59
    KhôngKhôngN/aN/a


    Độc nhất

    Lớp chỉ mụcLoại chỉ mụcLưu trữ giá trị nullCho phép nhiều giá trị nullLà loại quét nullKhông phải là loại quét null
    Khóa chính
    CREATE TABLE t1 (
      col1 VARCHAR(10),
      col2 VARCHAR(20),
      INDEX (col1, col2(10))
    );
    59
    KhôngKhôngN/aN/a
    Độc nhất
    CREATE TABLE t1 (
      col1 VARCHAR(10),
      col2 VARCHAR(20),
      INDEX (col1, col2(10))
    );
    59
    KhôngKhôngN/aN/a
    Độc nhất
    CREATE TABLE t1 (
      col1 VARCHAR(10),
      col2 VARCHAR(20),
      INDEX (col1, col2(10))
    );
    59
    KhôngKhôngN/aN/a
    Khóa chính
    CREATE TABLE t1 (
      col1 VARCHAR(10),
      col2 VARCHAR(20),
      INDEX (col1, col2(10))
    );
    59
    KhôngKhôngN/aN/a
    Độc nhất
    CREATE TABLE t1 (
      col1 VARCHAR(10),
      col2 VARCHAR(20),
      INDEX (col1, col2(10))
    );
    59
    KhôngKhôngN/aN/a
    Độc nhất
    CREATE TABLE t1 (
      col1 VARCHAR(10),
      col2 VARCHAR(20),
      INDEX (col1, col2(10))
    );
    59
    KhôngKhôngN/aN/a

    Độc nhất

    Đúng

  • Mục lục

    Chìa khóa

  • Bàn

    Bảng & NBSP; 13.3 & NBSP; Đặc điểm chỉ số công cụ lưu trữ Myisam

    Bảng & NBSP; 13.4 & NBSP; Đặc điểm chỉ số công cụ lưu trữ bộ nhớ

    CREATE TABLE t1 (col1 INT, col2 INT, INDEX func_index ((ABS(col1))));
    CREATE INDEX idx1 ON t1 ((col1 + col2));
    CREATE INDEX idx2 ON t1 ((col1 + col2), (col1 - col2), col1);
    ALTER TABLE t1 ADD INDEX ((col1 * 40) DESC);
    0

    INDEX ((col1), (col2))
    0

    Bảng & NBSP; 13,5 & NBSP; Đặc điểm chỉ số công cụ lưu trữ NDB

  • Bảng (xem Lưu ý 1)

    Bảng ghi chú:

  • 1.

    CREATE TABLE t1 (
      col1 VARCHAR(10),
      col2 VARCHAR(20),
      INDEX (col1, col2(10))
    );
    24 ngăn chặn việc tạo ra một chỉ số được đặt hàng ngầm.

    Các giá trị được phép là một chuỗi theo nghĩa đen chứa một tài liệu

    INDEX ((col1 + col2), (col3 - col4))
    8 hợp lệ hoặc một chuỗi trống (''). Không hợp lệ
    INDEX ((col1 + col2), (col3 - col4))
    8 bị từ chối.

    CREATE TABLE t1 (col1 INT, col2 INT, INDEX func_index ((ABS(col1))));
    CREATE INDEX idx1 ON t1 ((col1 + col2));
    CREATE INDEX idx2 ON t1 ((col1 + col2), (col1 - col2), col1);
    ALTER TABLE t1 ADD INDEX ((col1 * 40) DESC);
    1

    Các giá trị

    CREATE TABLE t1 (col1 INT, col2 INT, INDEX func_index ((ABS(col1))));
    CREATE INDEX idx1 ON t1 ((col1 + col2));
    CREATE INDEX idx2 ON t1 ((col1 + col2), (col1 - col2), col1);
    ALTER TABLE t1 ADD INDEX ((col1 * 40) DESC);
    37 và
    CREATE TABLE t1 (col1 INT, col2 INT, INDEX func_index ((ABS(col1))));
    CREATE INDEX idx1 ON t1 ((col1 + col2));
    CREATE INDEX idx2 ON t1 ((col1 + col2), (col1 - col2), col1);
    ALTER TABLE t1 ADD INDEX ((col1 * 40) DESC);
    38 có thể được lặp lại mà không có lỗi. Trong trường hợp này, giá trị được chỉ định cuối cùng được sử dụng.

    Các giá trị

    CREATE TABLE t1 (col1 INT, col2 INT, INDEX func_index ((ABS(col1))));
    CREATE INDEX idx1 ON t1 ((col1 + col2));
    CREATE INDEX idx2 ON t1 ((col1 + col2), (col1 - col2), col1);
    ALTER TABLE t1 ADD INDEX ((col1 * 40) DESC);
    37 và
    CREATE TABLE t1 (col1 INT, col2 INT, INDEX func_index ((ABS(col1))));
    CREATE INDEX idx1 ON t1 ((col1 + col2));
    CREATE INDEX idx2 ON t1 ((col1 + col2), (col1 - col2), col1);
    ALTER TABLE t1 ADD INDEX ((col1 * 40) DESC);
    38 không được kiểm tra bởi máy chủ, chúng cũng không bị xóa khi công cụ lưu trữ của bảng được thay đổi.

Làm cách nào để lập chỉ mục một bảng trong mysql?

Nói chung, chúng tôi tạo một chỉ mục tại thời điểm tạo bảng trong cơ sở dữ liệu. Câu lệnh sau đây tạo ra một bảng có chỉ mục chứa hai cột COL2 và COL3. Nếu chúng tôi muốn thêm chỉ mục vào bảng, chúng tôi sẽ sử dụng câu lệnh Creat Index như sau: mysql> Tạo index [index_name] trên [TABOR_NAME] (tên cột)mysql> CREATE INDEX [index_name] ON [table_name] (column names)

Tôi có thể thêm chỉ mục vào bảng hiện có mysql không?

Để tạo các chỉ mục, hãy sử dụng lệnh tạo chỉ mục: Tạo index_name trên table_name (cột_name);Bạn có thể một chỉ mục trên nhiều cột.use the CREATE INDEX command: CREATE INDEX index_name ON table_name (column_name); You can an index on multiple columns.

Làm thế nào để bạn tạo một chỉ mục trên một bảng hiện có?

Tạo cú pháp chỉ mục duy nhất trên bảng_name (cột1, cột2, ...);Lưu ý: Cú pháp để tạo các chỉ mục khác nhau giữa các cơ sở dữ liệu khác nhau.Do đó: Kiểm tra cú pháp để tạo các chỉ mục trong cơ sở dữ liệu của bạn.ON table_name (column1, column2, ...); Note: The syntax for creating indexes varies among different databases. Therefore: Check the syntax for creating indexes in your database.

Chúng ta có thể tạo chỉ mục trên bảng không?

Lệnh tạo chỉ mục được sử dụng để tạo các chỉ mục trong các bảng (cho phép các giá trị trùng lặp).Các chỉ mục được sử dụng để lấy dữ liệu từ cơ sở dữ liệu rất nhanh.Người dùng không thể nhìn thấy các chỉ mục, chúng chỉ được sử dụng để tăng tốc các tìm kiếm/truy vấn.