数据库高级知识–数据库的索引优化
涉及到对索引的优化,一般会采用explain进行sql语句的测试,它的作用是能够在不执行sql语句的情况下,返回该sql语句的一些基本信息。
下方是一个查询语句的例子:
EXPLAIN SELECT * FROM employees WHERE name= 'LiLei';
得到的结果如图:
可以看见以下列出了几个信息,接下来我对几个信息做一个较为详细的概括:
1、id:这里的id并不是我们查询的结果集中的id,这里的id代表着我们每一个select语句的优先级特征,我们在日常的sql查询中经常会碰见一些select嵌套select,例如:
select (select 1 from actor where id = 1) from (select * from film where id = 1);
从此处你可以清晰的看见 select 语句的嵌套查询,然后将这个语句给到mysql处理时便会有一个执行select的先后顺序,简单的说有几个select就会有几个id,并且id列值越大执行的优先级便越高。
2、select_type:在这个列中会有比较多的值,例如simple,primary,subquery,derived,union,这一列所反映的是查询语句的复杂程度。
3、table:这个列表明的是explain当前正在访问哪一个select的表
4、partitions:表示当前所匹配的分区
5、type:这一列表示关联的类型,通俗点说就是mysql将会以什么样的方式去查找表中的行,以及查找数据记录的范围,比较常见的几种模式我也进行了列举排名,左侧的为速度最快的查询类型:
system > const > eq_ref > ref > range > index > ALL
6、possible_keys:这里列举的是mysql在查询之前提前进行了估计,判断 这一个查询语句大概会使用哪些索引进行查询
7、key:这一列所表示的是,mysql在查询的过程中实际上使用了哪些的索引来帮助查找
8、key_len:这一列其实就是将所运用到的索引列的字节大小进行相加,通过这个数值其实反向也可以进行猜测,我们的sql语句到底在查询的过程中使用了哪些索引来增加我们的查询速度。
9、ref:这一列所向我们展示的是在查询的过程中,sql语句到底使用了哪些常量或者是字段名。如图所示代码以及运行结果:
explain select film_id from film_actor where film_id = 1;
这边可以看见,我们在查询的过程中使用了film_id = 1 此处使用到了常量1,所以结果便显示const
10、rows:这一列也是在我们测试sql语句的过程中比较重要的一列,通过这一列,我们可以清楚的知道我们所写出来的sql语句在运行过程中到底遍历了多少行,这个遍历可以换中说法,读取并检测数据。
11、Extra:这一列表示的是许多的附加信息,它也包含了许多的重要值:
(1)Using index:使用覆盖索引
(2)Using where:使用 where 语句来处理结果,查询的列未被索引覆盖
(3)Using index condition:查询的列不完全被索引覆盖,where条件中是一个前导列的范围
(4)Using temporary:mysql需要创建一张临时表来处理查询。出现这种情况一般是要进行优化的,首先是想到用索引来优化。
(5)Using filesort:将用外部排序而不是索引排序,数据较小时从内存排序,否则需要在磁盘完成排序。这种情况下一般也是要考虑使用索引来优化的。
(6)Select tables optimized away:使用某些聚合函数(比如 max、min)来访问存在索引的某个字段