Mysql全表扫描

一,全表扫描是什么?

全表扫描,就是一条一条记录的遍历,直到表中的最后一条记录。

在数据库中,对无索引的表进行查询一般称为全表扫描。全表扫描是数据库服务器用来搜寻表的每一条记录的过程,直到所有符合给定条件的记录返回为止。
在使用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)

id相同2.当id不一致时,则是id的值越大,执行优先级越高。

(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

在这里插入图片描述
MATERIALIZED:被物化的子查询

例: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)

你可能感兴趣的:(Mysql全表扫描)