我们容易有以一个误区,就是在经常使用的查询条件上都建立索引,索引越多越好,那到底是不是这样呢?
因为索引对于改善查询性能的作用是巨大的,所以我们的目标是尽量使用索引。但这并不意味着索引越多越好,因为索引会占用内存,还需要维护,并且索引还会影响增删改速度。
所以我们创建索引时有什么能参考的属性,或者要遵守的原则呢?
1.列的离散度
我们先来看一个重要的属性列的离散度,公式如下:
count(distinct(column_name)) : count(*) -- 列的全部不同值个数:所有数据行行数
数据行数相同的情况下,分子越大,列的离散度就越高。简单来说,如果列的重复值越多,离散度就越低,重复值越少,离散度就越高。我们来思考一个问题:在下图所示的表中,name上面建立索引和在gender上面建立索引有什么区别?
当我们用在gender上建立的索引去检索数据的时候,由于重复值太多,需要扫描的行数就更多。例如,我们现在在gender列上面创建一个索引,然后看一下执行计划。
ALTER TABLE user_innodb ADD INDEX idx_user_gender(gender); -- 创建索引(耗时比较久)
EXPLAIN SELECT * FROM `us