二、索引的用处
图1
图2
由上图1可以看出,如果建立了索引但是因为数据量较小也有可能不走索引,由图2可以看出如果建立了多个索引 mysql优化器会在这些索引中选择查询最少行的索引。
例如,如果在(col1,col2,col3)上有三列索引(组合索引),则在(col1),(col1,col2)和(col1,col2,col3)上有索引搜索功能
下面用同一个sql语句,图一使用的索引,图二去掉了索引,显然第一个走了索引,因为在innodb myisam 两种执行引擎下索引的结构都为b+tree,因此可以直接在有序的索引结构中获取最大值和最小值所对应的主键id,然后进行回表,查找到对应的值。
注:只有主键索引的叶子节点中才会存储行数据,普通索引在叶子节点中值存储对应的主键值;
图1:gender建立了对应的索引
图2:gender去除了对应的索引
当查询的列为主键id时,只需要通过普通索引进行查询就可以,因为普通索引的叶子节点存储的为主键id,这时不需要进行回表;因为已经检索到需要的主键列,这就是所谓的覆盖索引。
在表中建立了以下的索引 其中绿色为组合索引:
其中id为int age 和 score为smallint mysql优化器会自动选择最短的索引进行检索;
当把age的数据类型改成bigint后 mysql选择了score;
原文:https://www.cnblogs.com/dongl961230/p/12987786.html