尽管是对 MySQL 表上最后 5 个 id 进行非常基本的查找,但以下查询(没有解释)执行速度相当慢(几秒)。我在解释中注意到,它使用了一个没有意义的键,因为我们在查询中没有使用该字段(“互补”)。
如果我们删除 COALESCE,它就会正常工作。不幸的是,这对我们来说不是一个选择,因为我们需要将 NULL 值(在其他字段上)强制为空字符串或输出中的其他值。
不幸的是,该查询正在我们无法更改的系统中使用。
按原样,为什么执行路径会这样发生?
mysql> explain SELECT COALESCE(bags.id,'') AS "_g1",
-> bags.id AS "bags_id"
-> FROM bags
-> GROUP BY 1
-> ORDER BY concierge_bags.id DESC
-> LIMIT 5 \G;
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: bags
type: index
possible_keys: NULL
key: index_bags_on_complimentary
key_len: 2
ref: NULL
rows: 286582
Extra: Using index; Using temporary; Using filesort
1 row in set (0.00 sec)
mysql> SHOW CREATE TABLE bags \G;
*************************** 1. row ***************************
Table: bags
Create Table: CREATE TABLE `bags` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`complimentary` tinyint(1) DEFAULT '0',
`state` varchar(255) NOT NULL,
PRIMARY KEY (`id`),
KEY `index_bags_on_complimentary` (`complimentary`),
) ENGINE=InnoDB AUTO_INCREMENT=284632 DEFAULT CHARSET=latin1
请注意,我已经删除了不在该查询中的行李上的一些额外字段。
最佳答案
不能用 CASE 代替 COALESCE 吗?为什么你分组为 1?
关于mysql - 为什么这个 MySQL 索引会被用于这个查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21171140/