当数据库中数据量特别大的时候,查询的速度就比较慢,这时候需要添加索引,来提高查询速度。
索引的优点
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条件之后,就不再搜索其他的记录了。