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

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

说我有这个问题:

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

mysql说

  1. id select_type table partitions type possible_keys key key_len ref rows filtered Extra
  2. 1 PRIMARY <derived2> \N ref <auto_key0> <auto_key0> 6 const 1 100.00 \N
  3. 2 DERIVED <derived3> \N system \N \N \N \N 1 100.00 \N
  4. 3 DERIVED \N \N \N \N \N \N \N \N \N No tables used
  5. 4 UNION <derived5> \N system \N \N \N \N 1 100.00 \N
  6. 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 说:

  1. SELECT *
  2. FROM t1 JOIN (SELECT DISTINCT f1 FROM t2) AS derived_t2
  3. 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 ... 将返回类似

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

相关问题