一,全表扫描是什么?
全表扫描,就是一条一条记录的遍历,直到表中的最后一条记录。
在数据库中,对无索引的表进行查询一般称为全表扫描。全表扫描是数据库服务器用来搜寻表的每一条记录的过程,直到所有符合给定条件的记录返回为止。
在使用EXPLAIN分析SQL时,当列出执行计划表中type字段值为ALL时,代表需要全表扫描。
二,什么情况会进行全表扫描?
–1)条件中使用了null
–2)使用or作为连接条件
–3)使用[not] in时
–4)使用模糊查询时
–5)使用!=或者<>时
–6)使用count(*)时
–7)使用参数作为条件时
–8)索引使用不当时
–9)左模糊查询:like ‘%XXX’
三,如何避免全表扫描?
1.添加索引列。
正确添加索引列应该注意以下场景:
–1) 该列是否在应用为唯一索引,如果不为唯一索引,重复值的出现概率为多少,如果重复值出现多,是否可以与其他列一起组合成为联合索引而降低其重复率;
–2) 多个单独应用可能建立了多个索引,对于较大表而言,索引的大小与索引的维护也会对数据库性能产生重大影响,此时应该考虑是否能够将应用合并或根据应用特点将索引合并;
–3)表的操作中在insert、update和delete等涉及数据变化的操作中,也会设计到索引的维护。对于表内无效数据定时移除并备份,无效或低效索引的删除也会提高相关SQL语句的性能。
2. 使用ANALYZE TABLE tbl_name语句来更新被扫描表中索引的分布。
3. 对被扫描表使用FORCE INDEX语句来强制优化器对该表放弃全表扫描而使用索引,如下:
四,语法
EXPLAIN +查询语句
例:EXPLAIN SELECT * FROM mdhdb_api_account
五,解释
像这个例子的话 他查出来 则会是 如下:
我们可以看到 他的表头有 :
id , select_type , table , type , possible_keys , key , key_len, ref , rows , Extra
下面 来一个一个解释意思
(1).id表示在这条查询语句中子句被执行的顺序,
1.当id相同时,执行顺序是由上至下。
例:
EXPLAIN SELECT * FROM mdhdb_warehouse_order
WHERE id IN(SELECT xh_order FROM mdhdb_warehouse_order_item)
(2).select_type 表示查询语句中子句的类型
1.SIMPLE
简单的SELECT语句(不包括UNION操作或子查询操作)
例:SELECT * FROM mdhdb_warehouse_order
2 PRIMARY/UNION
PRIMARY:查询中最外层的SELECT(如两表做UNION或者存在子查询的外层的表操作为PRIMARY,内层的操作为UNION)
UNION:联合查询操作语句
3.DEPENDENT UNION/UNIOIN RESULT
DEPENDENT UNION:UNION操作中,查询中处于内层的SELECT(内层的SELECT语句与外层的SELECT语句有依赖关系)
UNION RESULT:UNION操作的结果,id值通常为NULL
例:EXPLAIN SELECT * FROM mdhdb_warehouse_order
WHERE id =1170223
UNION
SELECT * FROM mdhdb_warehouse_order
WHERE id =1170224)
4.SUBQUERY/DEPENDENT SUBQUERY
SUBQUERY:子查询中首个SELECT(如果有多个子查询存在)
DEPENDENT SUBQUERY:子查询中首个SELECT,但依赖于外层的表(如果有多个子查询存在)
重点解释 子查询的查询方式依赖于外面的查询结果.用这个例子就是,先进行子查询外部的查询,得到一个结果集,.然后这个结果的每一行在跟select子查询的结果集进行匹配,也就是说,外部结果集的每一行都要关联内部结果集一次
5.DERIVED/MATERIALIZED
DERIVED:被驱动的SELECT子查询(子查询位于FROM子句)
例:EXPLAIN SELECT * FROM (SELECT create_date FROM mdhdb_warehouse_order_item) a
例:EXPLAIN SELECT * FROM mdhdb_warehouse_order
WHERE create_date IN(SELECT create_date FROM mdhdb_warehouse_order_item)
6.UNCACHEABLE SUBQUERY/UNCACHEABLE UNION
UNCACHEABLE SUBQUERY:对于外层的主表,子查询不可被物化,每次都需要计算(耗时操作)
UNCACHEABLE UNION:UNION操作中,内层的不可被物化的子查询(类似于UNCACHEABLE SUBQUERY)