mysql索引

mysql 索引 基于B+树的数据结构 作用:加速查找和排序。
分为普通索引,唯一索引,组合索引
唯一索引要求索引列的值必须唯一,但允许有空值。
mysql -次查询只能使用一个索引,如果对多个字段使用索引需要建立复合索引。
一、组合索引的使用遵循最左前缀原则。
即where 条件的使用顺序需按照组合索引的建立顺序排序,
假设建立 (a,b,c)索引
1.where a = 1 and b = 1 and c = 1;
这样使用到了a,b,c的组合索引。
2.where a = 1 and b = 1
只使用到了a,b索引

3.where a = 1 and b = 1 order by c
查找使用了 a,b 索引,排序使用到了c索引

4.where a = 1 order by c
查找使用到了a索引,排序没有使用索引,因为少了中间的b字段的条件

5.where a = 1 order by b,c
查找使用到了a索引,排序使用到了b,c索引

6.where a = 1 order by b asc, c desc
b 和 c的排序不一致,排序无法使用索引。

二、mysql有优化器,可以自动优化索引将索引排序
1.where b = 1 and c = 1 and a = 1
mysql优化器会在底层转化成 where a = 1 and b = 1 =and c = 1
就算顺序写的不一样也能用到a,b,c索引
2.where a = 1 and b > 1 and c = 1
遇到范围查询之后,后面的索引就用不了,用到了a的索引和b的部分索引,无法使用c的索引

3.where b > 1 and a = 1 and c 1
mysql会转化成where a = 1 and b > 1 and c = 1
能用到a的索引和b的部分索引

三、其他一些会导致索引失效的情况
索引的底层是平衡m叉树,即无法使用平衡m叉树进行查找的情况就无法使用索引。
1.使用in会导致无法使用索引查询

2.使用 is null 或者 is not null会导致无法使用索引

3.varchar 类型的字段查询需要加上单引号,否则无法使用索引

where name = ‘1’ 可以使用索引
where name = 1 mysql 会在底层进行整型转字符的类型转化,但无法使用索引。

  1. 使用 != 或 <> 无法使用索引

5.like “%abc”
%号在前的情况

6.使用or可能导致索引失效
如果or 条件里面有一个条件没有索引就不会使用索引。

四、排序最好能使用到索引
如果order by没有使用索引排序,则会使用 filesort 文件排序。
会从文件中读取数据到缓冲区进行排序,如果缓冲区满则会创建临时文件,如果需要排序的数据量比较大,则会多次IO读取,创建多个临时文件,对性能消耗很大。

解决办法:
1.对常用的order by 条件使用索引进行排序
2.调大sort_buffer_size 缓冲区大小,以减少单次排序读取IO的次数。

你可能感兴趣的:(数据库)