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