当数据库中数据量特别大的时候,查询的速度就比较慢,这时候须要添加索引,来提升查询速度。mysql
索引的优势sql
1>经过建立惟一索引,能够保证数据库表中每行数据的惟一性。数据库
2>加快数据查询速度优化
3>在使用分组和排序进行数据查询时,能够显著的减小查询中分组和排序的时间spa
索引的缺点排序
1>维护索引须要消耗数据库资源索引
2>索引须要占用磁盘空间,索引文件可能会比数据库文件更快达到文件的最大尺寸资源
3>对表的数据进行增/删/改的时候,须要维护索引,因此会影响增/删/改的速度io
索引的分类table
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条件以后,就再也不搜索其余的记录了。