mysql - 为什么这个 MySQL 索引会被用于这个查询?

标签 mysql query-optimization

尽管是对 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/

相关文章:

MySQL Join 子句与 WHERE 子句

PHP mysqli 测试运行

MySQL C pdb 文件

mysql 查询耗时超过 30 秒

python - MySql 到 Python 模型创建工具

php - 数据模式对话框不显示

mysql - MySQL的使用说明

mysql - 优化跨多个表的全文搜索

sql - 排序(在合并连接之前)如何增加行数?

mysql - 使用多个内部连接和顺序子句时 sql 查询速度极慢