MySQL索引:复合与列

时间:2017-02-07 12:24:23

标签: mysql indexing innodb database-administration

我已经通过了一些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如何决定执行计划的索引?

2 个答案:

答案 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