怎样确定你的SQL使用索引没有

本文将介绍在 MySQL 数据库中怎样确定你的 SQL 语句使用索引没有

在实际开发中,select 语句是我们使用频率最高的 SQL 语句之一,而且也是最容易出现性能问题的地方。特此,我们需要为数据库表创建索引,使用索引来提升 select 语句的查询效率。

在 mysql 数据库创建索引优化之后,在执行 select 查询时要怎样确定我们是否使用了创建的索引。如果没有使用,创建索引也就失去了意义,而且还浪费资源。

mysql 中,确定一个 select 查询是否使用了索引,可以通过 explain 语句打印 select 语句的查询计划来查看索引使用情况。

示例

下面通过一个 SQL 语句根据 path 和 date 列模糊查询 et_kwh 数据表。先为 et_kwh 创建两个索引,如下图:

怎样确定你的SQL使用索引没有

分别执行如下几个SQL语句,分别观察他们的执行计划:

(1)path 和 date 仅进行右边模糊查询,如下:

explain select * from et_kwh where path like '#2#1386#%' and date like '202008%';

执行计划如下图:

怎样确定你的SQL使用索引没有

注意:上图中的 type 列为 range,说明使用了索引;并且使用了 index_path 和 index_date 两个索引。

(2)path 进行右边模糊查询,date 进行左右两边模糊查询,如下:

explain select * from et_kwh where path like '#2#1386#%' and date like '%202008%';

执行计划如下图:

怎样确定你的SQL使用索引没有

注意:上图中的 type 列为 range,说明使用了索引;且上面仅仅使用了 index_path 索引。

(3)path 和 date 两者均进行左右两边模糊查询,如下:

explain select * from et_kwh where path like '%#2#1386#%' and date like '%202008%';

执行计划如下图:

怎样确定你的SQL使用索引没有

注意:上图中的 type 列为 ALL,说明未使用索引;

EXPLAIN 列说明

table

显示这一行的数据是关于哪张表的;如果表使用了别名,则 table 显示别名名称。例如:

怎样确定你的SQL使用索引没有

type

type 显示的是访问类型,是较为重要的一个指标,结果值从好到坏依次是:

system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL 

一般来说,得保证查询至少达到 range 级别,最好能达到 ref。

possible_keys

显示可能应用在这张表中的索引。如果为空,则没有可能的索引。例如:

怎样确定你的SQL使用索引没有

上图中,SQL 语句有可能使用 index_path 索引。

key

实际使用的索引。如果为 NULL,则没有使用索引。很少的情况下,MySQL 会选择优化不足的索引。这种情况下,可以在 SELECT 语句中使用 USE INDEX(indexname)来强制使用一个索引或者用 IGNORE INDEX(indexname)来强制 MySQL 忽略索引。如下:

怎样确定你的SQL使用索引没有

上图中,实际上使用了 index_path 索引。

key_len

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

ref

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

rows

MySQL 认为必须检查的用来返回请求数据的行数。

Extra

关于 MySQL 如何解析查询的额外信息。但这里可以看到的坏的例子是 Using temporary 和 Using filesort,意思 MySQL 根本不能使用索引,结果是检索会很慢。

不是每一次努力都有收获,但是,每一次收获都必须努力。
0 不喜欢
说说我的看法 -
全部评论(
没有评论
关于
本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,请来信告知:hxstrive@outlook.com
公众号