key:实际使用的索引
时间:2021-10-08

explain显示了mysql如何使用索引处理select语句和连接表。可以帮助选择更好的索引,写出更优化的查询句子。

使用方法,在select语句前添加explain:

如:

mysql> explain select * from kt_course order by create_time desc;


+----+-------------+-----------+------+---------------+------+---------+------+------+----------------+


| id | select_type | table   | type | possible_keys | key | key_len | ref | rows | Extra     |


+----+-------------+-----------+------+---------------+------+---------+------+------+----------------+


| 1 | SIMPLE   | kt_course | ALL | NULL     | NULL | NULL  | NULL |  29 | Using filesort |


+----+-------------+-----------+------+---------------+------+---------+------+------+----------------+


1 row in set

EXPLAIN列的解释:

select_type。

SIMPLE:简单的SELECT,不实用的UNION或子查询。

PRIMARY:最外层SELECT。

UNION:第二层,SELECT后使用UNION。

4)DEPENDENTUNION:UNION语句中的第二个SELECT依赖于外部查询。

UNIONRESULT:UNION的结果。

6)SUBQUERY:子查询中的第一个SELECT。

7)DEPENDENTSUBQUERY:子查询中的第一个SELECT取决于外部查询。

8)DERIVED:导出表SELECT(FROM子句子查询)

table:显示这一行的数据是关于哪个表的。

type:这是一个重要的列,显示连接的类型。const、eq_reg、ref、range、indexhe和ALL从最好到最差的连接类型。

posible_keys:显示可能应用于此表中的索引。若为空,则无可能索引。从WHERE语句中为相关域选择合适的语句。

key:实际使用的索引。若为NULL,则无索引。很少,MYSQL会选择优化不足的索引。在这种情况下,USEINDEX(indexname)可以用于SELECT语句中的强制索引或IGNOREINDEX(indexname)。

key_len:使用索引的长度。长度越短越好,不损失精度。

ref:如果可能的话,显示索引的哪一列是常数。

rows:MYSQL认为必须检查返回请求数据的行数。

Extra:如何解析MYSQL查询的额外信息。将在表4.3中讨论,但这里可以看到的不好的例子是Usingtemporary和Usingfilesort,这意味着MYSQL根本不能使用索引,结果是搜索会很慢。

描述extra列返回的意义。

如何解析MYSQL查询的额外信息。将在表4.3中讨论,但这里可以看到的不好的例子是Usingtemporary和Usingfilesort,这意味着MYSQL根本不能使用索引,结果是搜索会很慢。

Distinct:一旦MYSQL找到与行相匹配的行,就不再搜索了。

Notexists:MYSQL优化了LEFTJOIN。一旦找到符合LEFTJOIN标准的线,就不再搜索了。

RangecheckedforeachRecord(indexmap:#):没有找到理想的索引,所以MYSQL检查了前表中的每个行组合使用哪个索引,并用它从表中返回行。这是使用索引最慢的连接之一。

Usingfilesort:看到这个,查询需要优化。MYSQL需要额外的步骤来找出如何排序返回的行。它根据连接类型、存储排序键值和匹配条件的所有行指针对所有行进行排序。

Usingindex:列数据是从只使用索引中的信息而不读取实际行动的表中返回的,发生在所有请求列都是相同索引的部分。

Usingindex:所需数据只需在Index中获取,无需在表中获取数据。

Usingindexforgroup-by:数据访问和Usingindex一样,所需数据只需要读取索引。当GROUPBY或DISTINCT子句用于Query时,如果分组字段也在索引中,Extra中的信息将是Usingindexforgroup-by。当Usingtemporary看到这一点时,查询需要优化。在这里,MYSQL需要创建一个临时表来存储结果,这通常发生在ORDERBY上,而不是GROUPBY上。

Usingwhere:如果不读取表中的所有数据,或者不仅仅是通过索引获取所有所需的数据,Usingwhere信息就会出现。

Usingwherewithpushedcondition:这是一个只出现在NDBCluster存储引擎中的信息,只能通过打开ConditionPushdown优化功能来使用。控制参数为engine_condition_pushdown。

ImposibleWHEREnoticedafteradingconstables:MySQLQueryoptimizer通过收集到的统计信息判断不可能的结果。

Whereused使用Where从句来限制哪些行将与下一张表匹配或返回给用户。如果您不想返回表中的所有行,并且连接类型为ALL或index,则会发生,或查询不同连接类型的解释(按效率顺序排序)

system表只有一行:system表。这是const连接类型的特殊情况。

const:表中记录的最大值可以匹配此查询(索引可以是主键或唯一索引)。因为只有一行,这个值实际上是常数,因为MYSQL先读这个值,然后把它当成常数。

eq_ref:在连接中,MYSQL在查询时,从前表中读取每个记录的组合,用索引作为主键或唯一键时使用。

ref:这种连接类型只发生在查询使用不是唯一或主键的键或这些类型的部分(例如,使用最左边的前缀)时。对于之前表的每一行联合,所有记录都将从表中读出。这种类型严重依赖于根据索引匹配记录的数量——越少越好。

range:这种连接类型使用索引返回一个范围内的行,如使用>或查找东西时发生的情况。

index:这种连接类型完全扫描了前表中的每个记录(比ALL好,因为索引一般小于表数据)

ALL:这种连接类型完全扫描了前面的每一个记录联合,一般比较差,要尽量避免。

Notables中使用FROMDUAL或不包含任何FROM子句。

Notexists:在一些左连接中,MySQLQueryOptimizer可以通过改变原Query的组成来部分减少数据访问次数。

FullscanonNullkey:子查询中的一种优化方法,主要用于无法通过索引访问Null值的使用。

Rangecheckedforechrecord(indexmap:N):通过MySQL官方手册的描述,当MySQLQueryoptimizer没有找到好的可用索引时,如果前表的列值已知,可以使用一些索引。对于前表的每一行组合,MySQL检查是否可以使用range或index_merge访问方法索取行。

SELECTablesoptimizedaway:当我们使用某些聚合函数访问索引的某个字段时,MySQLQueryoptimizer将通过索引直接定位到所需的数据行完成整个查询。前提是Query不能有GROUPBY操作。使用MIN()或MAX()时。