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

时间:2014-01-16 19:32:08

标签: 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

请注意,我已经删除了不在此查询中的行李上的一些额外字段。

1 个答案:

答案 0 :(得分:0)

你不能用CASE而不是COALESCE吗?你为什么要分组1?