我已经通过了一些Q& A例如。
How does database indexing work?
Mysql covering vs composite vs column index
这些都是好的读物,但我对索引有了更多的疑问,即。 假设下表和执行计划:
CREATE TABLE student(`id` INT(9),
`name` VARCHAR(50),
`rollNum` INT(9),
`address` VARCHAR(50),
`deleted` int(2) default 0,
Key `name_address_key`(`name`,`deleted`),
Key `name_key`(`name`)
);
计划1:explain select * from student where name = "abc" and deleted =0;
显示键= name_address_key
计划2:explain select * from student where name = "abc"
它也显示相同的键= name_address_key
我的问题是: MySQl如何决定执行计划的索引?
答案 0 :(得分:1)
由于name
列的前缀为name_address_key
,因此该索引可用于匹配name
以及name_key
。没有理由让它更喜欢一个而不是另一个,但name_address_key
的基数可能更高,所以选择那个。
name_key
没有意义,因为它与name_address_key
是多余的,只会浪费空间。
答案 1 :(得分:1)
我希望它会选择name_key
,因为索引的大小较小。
我建议删除name_key
基本没用,正如@Barmar讨论的那样。
对于标志(int
),请不要使用4字节deleted
,请参阅TINYINT
和其他较小的数据类型。
有PRIMARY KEY
。
另一个好的读物(我的偏见):Indexing Cookbook