如何知道mysql中“auto\u key0”索引的背后是什么?

vshtjzan  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(1428)

说我有这个问题:

EXPLAIN SELECT *
FROM (
    SELECT "A" as a, i.n FROM (SELECT 1 AS n) AS i
    UNION ALL SELECT "B" as a, i.n FROM (SELECT 1 AS n) AS i) AS t
WHERE a = "B";

mysql说

id  select_type table   partitions  type    possible_keys   key key_len ref rows    filtered    Extra
1   PRIMARY <derived2>  \N  ref <auto_key0> <auto_key0> 6   const   1   100.00  \N
2   DERIVED <derived3>  \N  system  \N  \N  \N  \N  1   100.00  \N
3   DERIVED \N  \N  \N  \N  \N  \N  \N  \N  \N  No tables used
4   UNION   <derived5>  \N  system  \N  \N  \N  \N  1   100.00  \N
5   DERIVED \N  \N  \N  \N  \N  \N  \N  \N  \N  No tables used

所以mysql生成了一个中间索引 <auto_key0> 但这个指数的背后是什么?其中使用了哪些列?有没有办法手动设置这个索引,强制mysql使用一些列。

5hcedyr0

5hcedyr01#

https://dev.mysql.com/doc/refman/8.0/en/derived-table-optimization.html 说:

SELECT *
FROM t1 JOIN (SELECT DISTINCT f1 FROM t2) AS derived_t2
     ON t1.f1=derived_t2.f1;

如果这样做将允许对最低成本的执行计划使用ref访问,那么优化器将从派生的\t2在列f1上构造一个索引。
我认为这意味着索引的列是由连接表达式决定的。mysql优化器知道哪些列对索引有用,因为它们在 ON 连接的子句。
我不知道如何控制为派生表生成的索引。这个索引是短暂的。它是在查询期间为临时表创建的,当临时表在查询结束时被删除时,它将被自然删除。
如果您想对索引进行更多的控制,那么必须创建自己的表(临时表或永久表)并为其定义索引。
您可能还想阅读mysql optimizer负责人撰写的关于以下主题的博客:https://mysqlserverteam.com/mysql-5-7-improved-performance-of-queries-with-derived-tables/

vx6bjr1n

vx6bjr1n2#

EXPLAIN FORMAT=JSON SELECT ... 将返回类似

key: <auto_key0>, used_key_parts: ['a'], key_length: 6, ref: ['const']
``` `<auto_key0>` 优化器为派生表生成的索引。
(还有“优化器跟踪”;但这可能没有这个特别的信息。)

相关问题