【问题标题】:Eliminate mysql file sort in update query消除更新查询中的mysql文件排序
【发布时间】:2014-11-16 13:19:57
【问题描述】:

我有这样的表,用于在 mysql 中实现队列:

创建表`队列`(
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `queue_name` varchar(255) NOT NULL,
  `inserted` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `inserted_by` varchar(255) NOT NULL,
  `acquired` 时间戳 NULL DEFAULT NULL,
  `acquired_by` varchar(255) 默认为空,
  `delayed_to` 时间戳 NULL DEFAULT NULL,
  `priority` int(11) NOT NULL DEFAULT '0',
  `value` 文本不为空,
  `status` varchar(255) NOT NULL DEFAULT 'new',
  主键(`id`),
  KEY `queue_index` (`acquired`,`queue_name`,`priority`,`id`)
) 引擎=InnoDB AUTO_INCREMENT=1 默认字符集=utf8

我的问题是当我运行更新时 mysql 使用文件排序。执行速度很慢(表中 800k 行需要 5s)。

DESCRIBE UPDATE queue SET acquire = "test" WHERE acquire IS NULL AND queue_name = "q1" ORDER BY priority, id LIMIT 1;
+----+-------------+--------+-------+-------------- -+-------------+---------+-------------+--------+- --------------------------------------------+ |编号 |选择类型 |表|类型 |可能的键 |关键 | key_len |参考 |行 |额外 | +----+-------------+--------+-------+-------------- -+-------------+---------+-------------+--------+- --------------------------------------------+ | 1 |简单 |队列 |范围 |队列索引 |队列索引 |第772章常量,常量 | 409367 |使用哪里;使用文件排序 | +----+-------------+--------+-------+-------------- -+-------------+---------+-------------+--------+- --------------------------------------------+

奇怪的是,当我使用相同的 WHERE 条件和 ORDER 列运行 SELECT 查询时,未使用文件排序:

DESCRIBE SELECT id FROM queue WHERE acquire IS NULL AND queue_name = "q1" ORDER BY priority, id LIMIT 1;
+----+-------------+--------+------+--------------- +-------------+---------+-------------+--------+-- ------------------------------------+ |编号 |选择类型 |表|类型 |可能的键 |关键 | key_len |参考 |行 |额外 | +----+-------------+--------+------+--------------- +-------------+---------+-------------+--------+-- ------------------------------------+ | 1 |简单 |队列 |参考 |队列索引 |队列索引 |第772章常量,常量 | 409367 |使用哪里;使用索引 | +----+-------------+--------+------+--------------- +-------------+---------+-------------+--------+-- ------------------------------------+

(查询时间0s)

有谁知道如何避免在更新查询中使用文件排序或如何提高其性能?

问候, 马兹

【问题讨论】:

  • 可能是因为表中的 PRIMARY KEY。 MySQL 将在每个 UPDATE 上检查密钥的完整性。在 MariaDB 中,您可以禁用这些检查,也可能在 MySQL 上工作(参见 here

标签: mysql sql query-optimization filesort


【解决方案1】:

在 mysql 论坛 (http://forums.mysql.com/read.php?24,620908,620908#msg-620908) 讨论后,我报告了错误 http://bugs.mysql.com/bug.php?id=74049(已验证)。 使用 SELECT FOR UPDATE 可以绕过问题:

SET @update_id := -1;
SELECT (SELECT @update_id := id)
FROM queue
WHERE acquired IS NULL AND queue_name = "q1"
ORDER BY priority, id LIMIT 1;
FOR UPDATE;
UPDATE queue SET acquired = "test" WHERE id = @update_id;

【讨论】:

    猜你喜欢
    • 2012-02-18
    • 2015-03-28
    • 1970-01-01
    • 1970-01-01
    • 2013-09-15
    • 1970-01-01
    • 1970-01-01
    • 2011-02-15
    • 1970-01-01
    相关资源
    最近更新 更多