我一直试图将这个问题包围好,但没有运气。我在我的小站点上实现了一个简单的队列系统和一个cron作业来检查队列中是否有任何项目。它应该获取按优先级排序的几个项目并处理它们,但由于某种原因,优先级索引会被忽略。我的create table语法是
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 |
+----+-------------+------------+------+---------------+------+---------+------+------+----------------+
任何人都可以提供一些可能导致此问题的见解吗?
答案 0 :(得分:1)
因为当它只有几行(原来是4,然后增加到1k)时没有理由使用索引,因为它会更慢(mysql必须读取索引和数据页太多次)。
所以mysql查询优化的经验法则:当你这样做时使用相当大量的数据。如果尺寸与实际生产数据大小相当,那就太好了。