问题遇到的现象和发生背景
组合索引到底是什么用处,在什么场景下会用到?
组合索引表示在创建的索引中,包含数据表中的多个字段或列。MySQL中,同样支持在一张数据表中创建多个组合索引。在使用组合索引查询数据时,MySQL支持最左匹配原则。
例如,创建数据表t6,并为数据表中的t_no、t_name和t_department_id字段创建复合索引。
mysql> CREATE TABLE t6 (
-> id INT NOT NULL,
-> t_no VARCHAR(32) NOT NULL DEFAULT '',
-> t_name VARCHAR(30) NOT NULL DEFAULT '',
-> t_department_id INT NOT NULL DEFAULT 0,
-> INDEX no_name_department_index(t_no, t_name, t_department_id)
-> );
Query OK, 0 rows affected (0.12 sec)
SQL语句执行成功,查看t6数据表的表结构信息。
mysql> SHOW CREATE TABLE t6 \G
*************************** 1. row ***************************
Table: t6
Create Table: CREATE TABLE t6
(
id
int(11) NOT NULL,
t_no
varchar(32) NOT NULL DEFAULT '',
t_name
varchar(30) NOT NULL DEFAULT '',
t_department_id
int(11) NOT NULL DEFAULT '0',
KEY no_name_department_index
(t_no
,t_name
,t_department_id
)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)
结果显示成功为t6数据表中的t_no、t_name和t_department_id字段创建了名称为no_name_department_index的复合索引。
名称为no_name_department_index的复合索引在进行存储时,是按照t_no/t_name/t_department_id的顺序进行存放的。根据索引的最左匹配原则,当在查询数据时,使用(t_no)、(t_no,t_name)和(t_no,t_name,t_department_id)中的一种进行查询时,MySQL会使用索引。当使用(t_name)、(t_department_id)和(t_name,t_department_id)查询数据时,MySQL不会使用索引。