当数据库中数据量特别大的时候,查询的速度就比较慢,这时候需要添加索引,来提高查询速度。

索引的优点

1>通过创建唯一索引,可以保证数据库表中每行数据的唯一性。

2>加快数据查询速度

3>在使用分组和排序进行数据查询时,可以显著的减少查询中分组和排序的时间

索引的缺点

1>维护索引需要消耗数据库资源

2>索引需要占用磁盘空间,索引文件可能会比数据库文件更快达到文件的最大尺寸

3>对表的数据进行增/删/改的时候,需要维护索引,所以会影响增/删/改的速度

索引的分类

1.普通索引和唯一索引

主键索引是一种特殊的唯一索引,不允许有空值。

2.单索引和复合索引

单索引只包含单个列

复合索引,指在多个字段上创建索引,查询时,只有使用了第一个索引字段时,其它索引才会被使用,使用复合索引时遵循最左前缀集合。

3.全文索引

全文索引类型为fulltext,在定义索引的列上支持值的全文查找,允许这些索引列的值重复且可以为空值,全文索引可以在char、varchar、text类型列上创建。

 

使用explain,我们知道mysql如何使用索引来处理select语句以及连接表,可以帮助我们选择更好的索引和写出更优化的查询语句。如下示例

explain详解

1.id

它是sql语句执行的顺序。如上示例可以看出先执行外层select,再执行内层select。

2.select_type

它提供了各种“列属性”引用的类型,最常见的值包括如下

1>simple    表示简单的select,没有union和子查询。

2>primary    最外面的select,在有子查询的语句中,最外面的select查询就是primary,如上例子就是

3>union    SQL语句中带有union   

4>derived    当查询的表不是一个物理表时,那么它就叫做derived。如上示例tt表不是一个物理表

3.table

很明显,它是查询所用的表

4.type

表示mysql在表中找到所需要记录的方式,又称为"连接类型"或"访问类型",从最好到最差依次如下

system:表示只有一行记录(等于查询系统表)

const:表示表中最多只有一行匹配的记录

range:只检索给定范围的行,key列显示使用了哪个索引。当使用=、>、<、between操作符时,可以使用range

index:全表扫描,只是扫描表的时候按照索引次序进行而不是行,主要优点是避免了排序,但是依然消耗很大的开销

all:最坏的情况,从头到尾全表扫描

5.possible_keys

表示mysql在搜索表记录时可能会使用哪个索引。注意,该字段完全独立于explain显示的表顺序,因此,possible_keys里面所包含的索引可能在实际的使用中并没有用到,即这个字段的值是null时,就表示没有索引被用到。

6.key

该字段表示mysql查询实际使用的索引,当没有任何索引被用到的时候,该字段值为null。

7.key_len

该字段表示mysql使用索引的长度,当key字段值为null时,索引的长度就是null。例如上述例子中,主键的长度是int类型,长度为10,这就至少需要4位来表示,所以索引的长度为4。

8.ref

该列表示 使用哪个列或常数与key一起从表中选择行

9.rows

表示mysql执行查询的行数,该数值越大,越不好,表明没有用好索引

10.extra

该字段显示了mysql查询过程中的附加信息,常见信息如下

Using index : 表示mysql使用了覆盖索引

Using where : 表示mysql在存储引擎检索后再进行过滤

Using temporary : 表示mysql对查询结果排序时会用到一个临时表

Using filesort : 表示mysql会对结果使用一个外部索引排序,即mysql使用where后面的索引查询结果,使用order by 后面的索引排序

distinct:mysql找到当前记录匹配结果的第一条记录之后,就不再搜索其他记录了

not exists:mysql在查询时做一个left join优化时,在当前表中找到与前一条记录符合left join条件之后,就不再搜索其他的记录了。