【发布时间】:2014-09-25 21:40:01
【问题描述】:
我一直在努力解决这个问题,但没有运气。我在我的小站点上实现了一个简单的队列系统和一个 cron 作业来检查队列中是否有任何项目。它应该获取按优先级排序的几个项目并处理它们,但由于某种原因,优先级索引被忽略了。我的创建表语法是
CREATE TABLE `site_queue` (
`row_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`task` tinyint(3) unsigned NOT NULL COMMENT '0 - email',
`priority` int(10) unsigned DEFAULT NULL,
`commands` text NOT NULL,
`added` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`row_id`),
KEY `task` (`task`),
KEY `priority` (`priority`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
获取排队项目的查询是
SELECT `row_id`, `task`, `commands` FROM `site_queue` ORDER BY `priority` DESC LIMIT 5;
EXPLAIN 查询返回以下内容:
+----+-------------+------------+------+---------------+------+---------+------+------+----------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+------------+------+---------------+------+---------+------+------+----------------+
| 1 | SIMPLE | site_queue | ALL | NULL | NULL | NULL | NULL | 1269 | Using filesort |
+----+-------------+------------+------+---------------+------+---------+------+------+----------------+
任何人都可以提供一些可能导致此问题的原因吗?
【问题讨论】:
-
如果将
priority包含在select列表中会怎样? -
还是太少了。添加 10-50k 行怎么样?
-
我刚刚尝试添加 - 仍然是文件排序。
-
顺便说一句,
priority列的基数是多少? -
优先级,默认情况下,是一个 UNIX_TIMESTAMP() + 一个优先级系数,所以它总是大致等于行数。添加 50k 行使 EXPLAIN 结果打印
possible_keys= NULL,key=priority,所以我想这确实是行数问题 - 谢谢!您能否将其添加到您的答案中,以便有相同问题的其他人在我接受时可以立即看到解决方案(或者更确切地说是不需要解决方案)?
标签: mysql indexing sql-order-by