MYSQL进阶路三:索引优化

Posted by DDW on 05-28,2020

索引优化

一、学习使用mysql执行计划

使用explain查看语句执行计划

explain selcet * from tb_index where a=5

image-1684051703680
我们可以看到,出现了好几列。

1、id:执行计划的序号

执行多个命令时标注的序号。(不重要)

2、select_type:查询类型

此查询的类型。(不重要)

3、table:查的表格

查询的表格名称(不重要)

4、type(重点):最关键的一列,显示查询使用了何种类型。

有可能显示以下情况:
1.const:查询索引字段,并且最多只有一行进行精确匹配。(只有主键查询只匹配一行才会是const)
2.eq_ref:搜索时使用primary key或unique类型的索引。
3.ref:根据索引查找一个或多个值,非唯一索引。
4.range:对索引列进行范围查找。
5.index:全索引表扫描。
6.all:全盘扫描(通常是没使到索引)
搜索效率为1到6从高到低。

5、possible_keys

可能会使用到的索引

6、keys

实际使用到的索引,如果为null,则没有使用到索引(重要)
一个语句有没有使用到索引,则具体看该行。

7、key_len

使用的索引长度。在不损失精确性的情况下,长度越短越好。

8、ref

显示索引的哪一列被使用了,如果使用的话是个常数const。

9、row

查询出来需要读取的行数。

二、索引优化

1、mysql优化

1.查询尽量使用确定的列名,少用*号。
2.尽量少嵌套子查询,这种查询会消耗大量的CPU资源。
3.避免使用耗费资源的操作
(1)DISTINCT
(2)UNION union all
(3)ORDER BY
(4)MINUS
minus直接翻译中文是减的意思,A MIUNS B的意思是在A中存在,B中不存在的记录。

select 字段1,字段2 from tableA where
MINUS
select 字段1,字段2 from tableB where

(5)INTERSECT
查询两张表中的交集,也就是说查询两张表共有的数据集。
语法:

select 字段1,字段2 from tableA where
INTERSECT
select 字段1,字段2 from tableB where

6、对于有比较多or运算的查询,建议分成多个查询,用union all连结起来。

2、合理使用索引

(1)建立索引不宜多,因为当数据更新的时候,索引表需要同步更新,会使用资源。
索引建议建立在不经常更新的字段上。
(2)尽量进行全值匹配,越精确越好。
(3)使用范围条件后索引会失效。
使用> in < 等范围查询后,后面跟的字段索引失效

name='XXX' and age>20 and height=1.75
age之后的height不会使用到索引。

所以,如果有条件范围,建立索引的时候用到范围的字段尽量往后面放。
(4)覆盖索引尽量使用
(5)不等于要慎用,也会无法使用索引。
(6)使用模糊查找的时候like %X,由于%放在前面,无法使用索引,但like X%会使用到索引。
(7)exists替换in

select * from T1 where T1.a in(select T2.a from T2);
select * from T1 where exists(select T2.a from T2);

T1数据量小而T2数据量大的时候,第二个查询效率高。
T1数据量大,而T2数据量小,第一个查询效率高。