为什么MySQL会忽略ORDER BY上的索引

时间:2014-09-25 21:40:01

标签: mysql indexing sql-order-by

我一直试图将这个问题包围好,但没有运气。我在我的小站点上实现了一个简单的队列系统和一个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 |
+----+-------------+------------+------+---------------+------+---------+------+------+----------------+

任何人都可以提供一些可能导致此问题的见解吗?

1 个答案:

答案 0 :(得分:1)

因为当它只有几行(原来是4,然后增加到1k)时没有理由使用索引,因为它会更慢(mysql必须读取索引和数据页太多次)。

所以mysql查询优化的经验法则:当你这样做时使用相当大量的数据。如果尺寸与实际生产数据大小相当,那就太好了。