MySQL EXPLAIN没有使用带有WHERE + ORDER BY的索引(两者都是索引的一部分)?

时间:2015-02-04 19:19:52

标签: mysql sql indexing database-indexes

我已在我的IDX_D34A04AD46C53D4C41FA5CD2表格中添加了一个索引(product),以便加快搜索已启用的产品,按价格升序排序:

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文档:

  

以下查询使用索引来解析ORDER BY部分:

     

SELECT * FROM t1 WHERE key_part1 = constant ORDER BY key_part2;

这似乎与我的完全相同。

2 个答案:

答案 0 :(得分:2)

这是您的查询:

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

因为is_enabled上存在不等式条件,所以它结束了索引的使用。因此,索引不能用于unit_price。或者,它可以用于unit_price和排序,但过滤将在输出上完成。

以下内容应使用索引:

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

答案 1 :(得分:1)

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

您的查询正在使用索引(is_enabled,unit_price),但它没有使用覆盖索引,因为您正在检索SELECT语句中的所有列。