索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度。
索引分为聚簇索引和非聚簇索引两种,聚簇索引是按照数据存放的物理位置为顺序的,而非聚簇索引就不一样了;聚簇索引能提高多行检索的速度,而非聚簇索引对于单行的检索很快。
Mysql 索引的类型
普通索引
最基本的索引,它没有任何限制,MyIASM中默认的BTREE类型的索引,也是我们大多数情况下用到的索引。
唯一索引
与普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值(注意和主键不同)。如果是组合索引,则列值的组合必须唯一,创建方法和普通索引类似。
主键索引
它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引,也可以用 ALTER 命令。记住:一个表只能有一个主键。
全文索引
全文索引和全文检索,FULLTEXT索引仅可用于 MyISAM 表;
他们可以从CHAR、VARCHAR或TEXT列中作为CREATE TABLE语句的一部分被创建,
或是随后使用ALTER TABLE 或CREATE INDEX被添加。
单列索引, 多列索引
多个单列索引与单个多列索引的查询效果不同,因为执行查询时,MySQL只能使用一个索引,会从多个索引中选择一个限制最为严格的索引。
组合索引(最左原则)
对多列进行索引(组合索引),列的顺序非常重要,MySQL仅能对索引最左边的前缀进行有效的查找。例如:
假设存在组合索引 it1c1c2(c1,c2)
,查询语句 select * from t1 where c1=1 and c2=2
能够使用该索引。查询语句select * from t1 where c1=1
也能够使用该索引。但是,查询语句select * from t1 where c2=2
不能够使用该索引,因为没有组合索引的引导列,即,要想使用c2列进行查找,必需出现c1等于某值。
即 =
和 in
查询时, 使用所有可以无视顺序位置
挑选索引
动作描述 | 使用聚集索引 | 使用非聚集索引 |
---|---|---|
列经常被分组排序 | 使用 | 使用 |
返回某范围内的数据 | 使用 | 不使用 |
一个或极少不同值 | 不使用 | 不使用 |
小数目的不同值 | 使用 | 不使用 |
大数目的不同值 | 不使用 | 使用 |
频繁更新的列 | 不使用 | 使用 |
外键列 | 使用 | 使用 |
主键列 | 使用 | 使用 |
频繁修改索引列 | 不使用 | 使用 |
注意项
- 索引不会包含有NULL值的列
- 使用短索引, 短索引不仅可以提高查询速度而且可以节省磁盘空间和I/O操作。
- 索引列排序 MySQL查询只使用一个索引,如果where子句中已经使用了索引,那么order by中的列是不会使用索引的。
- like语句操作 不鼓励使用like操作,如果非使用不可,
like "%aaa%"
不会使用索引而like "aaa%"
可以使用索引。 - 不要在列上进行运算 这将导致索引失效而进行全表扫描
Finally
- MySQL只对一下操作符才使用索引:<,<=,=,>,>=,between,in,以及某些时候的like(不以通配符%或_开头的情形)。
- 理论上每张表里面最多可创建16个索引