为什么要将此MySQL索引用于此查询?

为什么要将此MySQL索引用于此查询?,mysql,query-optimization,Mysql,Query Optimization,下面的查询(没有解释)执行得非常慢(几秒钟),尽管它是MySQL表上最后5个ID的基本查找。我在解释中注意到,它使用了一个毫无意义的键,因为我们在查询中没有使用该字段(“免费”) 如果我们移除凝聚体,它就会正常工作。不幸的是,这不是我们现在的选择,因为我们需要将空值(在其他字段上)强制为空字符串或输出中的其他值 不幸的是,在我们无法更改查询的系统中使用此查询 既然如此,为什么执行路径会以这种方式发生 mysql> explain SELECT COALESCE(bags.id,'') AS

下面的查询(没有解释)执行得非常慢(几秒钟),尽管它是MySQL表上最后5个ID的基本查找。我在解释中注意到,它使用了一个毫无意义的键,因为我们在查询中没有使用该字段(“免费”)

如果我们移除凝聚体,它就会正常工作。不幸的是,这不是我们现在的选择,因为我们需要将空值(在其他字段上)强制为空字符串或输出中的其他值

不幸的是,在我们无法更改查询的系统中使用此查询

既然如此,为什么执行路径会以这种方式发生

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上分组?

bags.id真的可以为空吗?我希望
id
是表主键的惯用名称。主键不能为空。您能否编辑您的问题并发布
SHOW CREATE TABLE bags
的输出,以便我们可以查看表及其索引的确切定义?bags.id实际上不可为空,但state字段不幸为空。另外,这个查询是由一个黑盒系统生成的,所以我们实际上对它没有太多的控制。只是想了解为什么查询会这样执行。我已经用table create语句更新了这个问题。
state
如何可以为空?它在列定义中表示
不为NULL
state
与查询有什么关系?我开始怀疑你只是在为一些不同的查询查看解释。我还注意到您的createtable输出无效,在索引后面有一个逗号。所以你显然在发布前编辑过这个。我想知道您还在编辑什么。您的SELECT语句也引用了
concierge\u bags.id
,但引用了查询中未定义的表(或表别名)。如果您要求他人帮助您分析问题,则需要在问题中发布真实的查询。在我们无法更改查询的系统中使用此查询。您是否理解为什么执行路径会以这种方式发生?