MySQL解释不使用WHERE+ORDER BY的索引(索引的两部分)?

MySQL解释不使用WHERE+ORDER BY的索引(索引的两部分)?,mysql,sql,indexing,database-indexes,Mysql,Sql,Indexing,Database Indexes,我已将索引IDX_D34A04AD46C53D4C41FA5CD2添加到我的产品表中,以加快搜索按价格升序的已启用产品: CREATE TABLE `product` ( `id` varchar(16) COLLATE utf8_unicode_ci NOT NULL, `unit_price` decimal(13,4) NOT NULL, `stock_qty` int(11) DEFAULT NULL, `is_enabled` tinyint(1) NOT NULL,

我已将索引IDX_D34A04AD46C53D4C41FA5CD2添加到我的产品表中,以加快搜索按价格升序的已启用产品:

CREATE TABLE `product` (
  `id` varchar(16) COLLATE utf8_unicode_ci NOT NULL,
  `unit_price` decimal(13,4) NOT NULL,
  `stock_qty` int(11) DEFAULT NULL,
  `is_enabled` tinyint(1) NOT NULL,
  `min_sale_qty` int(11) DEFAULT NULL,
  `max_sale_qty` int(11) DEFAULT NULL,
  `package_qty` int(11) DEFAULT NULL,
  `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `is_new` tinyint(1) NOT NULL,
  `created_at` date NOT NULL,
  `package_type` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `UNIQ_D34A04ADBF396750` (`id`),
  KEY `IDX_D34A04AD41FA5CD2` (`unit_price`),
  KEY `IDX_D34A04AD46C53D4C` (`is_enabled`),
  KEY `IDX_D34A04AD46C53D4C41FA5CD2` (`is_enabled`,`unit_price`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
搜索活动产品,按价格订购,每页显示50项:

EXPLAIN SELECT * FROM product WHERE is_enabled > 0 ORDER BY unit_price ASC LIMIT 0, 50;
输出:

1   SIMPLE  product index   IDX_D34A04AD46C53D4C,IDX_D34A04AD46C53D4C41FA5CD2   IDX_D34A04AD41FA5CD2    6       100 Using where
你能简单地解释一下我做错了什么,以及为什么我不能在我的示例中使用索引条件来实现吗

编辑:来自MySQL文档:

以下查询使用索引按部分解析订单:

从t1中选择*键,其中键\部分1=键\部分2的恒定顺序

这似乎与我的示例完全相同。

这是您的查询:

SELECT *
FROM product
WHERE is_enabled > 0
ORDER BY unit_price ASC
LIMIT 0, 50;
由于启用了is_上的不等式条件,因此将结束索引的使用。因此,该指数不能用于单价。或者,它也可以用于单价和排序,但过滤将在输出上完成

应使用以下索引:

SELECT *
FROM product
WHERE is_enabled = 1
ORDER BY unit_price ASC
LIMIT 0, 50;

额外列中的值“usingindex”表示MySQL将使用覆盖索引来避免访问表。事实并非如此


您的查询使用的是启用了索引的单价,但它没有使用覆盖索引,因为您正在检索SELECT语句中的所有列。

您的表中有多少行?@EricPetroleje现在~90000遗憾的是,EXPLAIN的输出基本相同。我还可以做些什么来了解错误?当我投入生产时,产品大约有20000件左右,我担心性能。@gremo,Gordon在第二个查询中展示了解决方案:在WHERE中使用=1比较,而不是>0。如果在“已启用”中搜索一个特定值,则匹配行可以按单价排序。按顺序在这两列上创建索引。