一、索引的优点
1、能大大减少服务器需要扫描的数据量。
2、帮助服务器避免排序和临时表。
3、将随机io变成顺序io。
二、索引的用处
-
能够快速匹配where条件对应的数据行。
-
从考虑中消除行,如果可以在多个索引之间进行选择,mysql通常会使用找到最少行的索引。
图1
图2
由上图1可以看出,如果建立了索引但是因为数据量较小也有可能不走索引,由图2可以看出如果建立了多个索引 mysql优化器会在这些索引中选择查询最少行的索引。
-
如果数据库表具有多列索引,数据库优化器可以使用任何列的索引最左前缀来查找行。
例如,如果在(col1,col2,col3)上有三列索引(组合索引),则在(col1),(col1,col2)和(col1,col2,col3)上有索引搜索功能
-
当有表连接的时候,从其他表检索行数据。
-
查找特定索引列的min和max值。
下面用同一个sql语句,图一使用的索引,图二去掉了索引,显然第一个走了索引,因为在innodb myisam 两种执行引擎下索引的结构都为b+tree,因此可以直接在有序的索引结构中获取最大值和最小值所对应的主键id,然后进行回表,查找到对应的值。
注:只有主键索引的叶子节点中才会存储行数据,普通索引在叶子节点中值存储对应的主键值;
图1:gender建立了对应的索引
图2:gender去除了对应的索引
-
如果排序或分组时在可用索引的最左前缀上完成的,则对表进行排序和分组
-
在某些特定的情况下,是不需要查询整行数据来检索值。
当查询的列为主键id时,只需要通过普通索引进行查询就可以,因为普通索引的叶子节点存储的为主键id,这时不需要进行回表;因为已经检索到需要的主键列,这就是所谓的覆盖索引。
-
当有多个索引列可以用来检索时 mysql优化器会自动选择最短的长度的索引来检索行。
在表中建立了以下的索引 其中绿色为组合索引:
其中id为int age 和 score为smallint mysql优化器会自动选择最短的索引进行检索;
当把age的数据类型改成bigint后 mysql选择了score;