我目前正在努力通过最优化原则2在该表上生成一个查询:为ORDER BY强制索引使用是否更好?
CREATE TABLE `publication` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`global_order` int(11) NOT NULL,
`title` varchar(63) COLLATE utf8_unicode_ci NOT NULL,
`slug` varchar(63) COLLATE utf8_unicode_ci NOT NULL,
`type` varchar(7) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `UNIQ_AF3C6779B12CE9DB` (`global_order`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
查询是
SELECT *
FROM publication
WHERE type IN ('article', 'event', 'work')
ORDER BY global_order DESC
type
是学说增加了鉴别列。尽管WHERE
子句无效,因为type
始终是IN
值之一,所以我无法删除它。
EXPLAIN
显示我
+------+---------------+------+------+-----------------------------+
| type | possible_keys | key | rows | Extra |
+------+---------------+------+------+-----------------------------+
| ALL | NULL | NULL | 562 | Using where; Using filesort |
+------+---------------+------+------+-----------------------------+
(每次我执行查询时rows
是不同的),经过一番阅读中,我发现我可以强制索引的使用是这样的:
ALTER TABLE `publication` DROP INDEX `UNIQ_AF3C6779B12CE9DB` ,
ADD UNIQUE `UNIQ_AF3C6779B12CE9DB` ( `global_order` , `type`)
和
SELECT *
FROM publication
FORCE INDEX(UNIQ_AF3C6779B12CE9DB)
WHERE global_order > 0
AND type IN ('article', 'event', 'work')
ORDER BY global_order DESC
的WHERE
条款始终是没用的,但这次EXPLAIN
显示我
+-------+-----------------------+-----------------------+------+-------------+
| type | possible_keys | key | rows | Extra |
+-------+-----------------------+-----------------------+------+-------------+
| range | UNIQ_AF3C6779B12CE9DB | UNIQ_AF3C6779B12CE9DB | 499 | Using where |
+-------+-----------------------+-----------------------+------+-------------+
在我看来,这是更好的,但现在看来,这不是常见的有给力的指数也因此我不知道它是否真的有效对于这样一个简单的查询。
有谁知道什么是更好的方式来执行此查询?
谢谢!
优秀的,详细的答案。 +1 – eggyal 2013-04-25 08:23:15
哇,谢谢你的解释! – MatTheCat 2013-04-25 09:05:44
Woops,我认为赏金是在答案被选中时给出的,对不起^^' – MatTheCat 2013-04-28 19:40:23