【问题标题】:Slow update Query慢更新查询
【发布时间】:2017-12-23 12:53:00
【问题描述】:

当我尝试使用以下查询更新我的 torrent 表(我的 torrent 站点只允许共享开源内容)时

    UPDATE `torrents` SET `leech` = '0', `seed` = '1' WHERE `id` = '26784' 

更新仅包含 20,000 条记录的表大约需要 0.5 秒。我的其他查询在不到 0.0478 秒内执行(SELECT 查询)

CREATE TABLE IF NOT EXISTS `torrents` (
`id` int(11) NOT NULL,
`hash_info` varchar(255) NOT NULL,
`category_slug` varchar(255) NOT NULL,
`name` varchar(255) NOT NULL,
`size` bigint(20) NOT NULL,
`age` int(11) NOT NULL,
`description` text NOT NULL,
`trackers` longtext NOT NULL,
`magnet` longtext,
`files` longtext,
`parent_category` int(11) NOT NULL,
`category` int(11) NOT NULL,
`publish_date` int(11) DEFAULT NULL,
`uploader` int(11) NOT NULL,
`seed` int(11) DEFAULT '0',
`leech` int(11) DEFAULT '0',
`file_key` varchar(255) DEFAULT NULL,
`comments_count` int(11) DEFAULT '0'
) ENGINE=InnoDB AUTO_INCREMENT=26816 DEFAULT CHARSET=latin1;

有什么办法吗?

【问题讨论】:

  • 赞成表名torrents ;) .. 世界不会在 0.5 秒内结束,可以忽略不计。一些外部因素可能是原因
  • 我的其他查询在不到 0.0478 秒内执行,所以我认为这是问题;)
  • 这里20.00020还是20000
  • 对不起,我的意思是 20000
  • 那么您可以在id 列上创建索引以减少所花费的时间..

标签: mysql sql database mariadb


【解决方案1】:

id 被声明为整数。所以,首先你的比较应该是一个整数而不是一个字符串:

UPDATE `torrents`
    SET `leech` = '0', `seed` = '1'
    WHERE `id` = 26784;

其次,您需要对 id 进行索引。您可以通过以下方式创建:

create index idx_torrents_id on torrents(id);

或者,将其设为表中的主键。

【讨论】:

  • 对不起,我得到了同样的结果:(
  • @KurtKoben - 请在添加 PK 后使用 SHOW CREATE TABLE 更新问题。
【解决方案2】:

基于索引列的查找比基于非索引列的查找快得多。随着数据量的增加,这种行为可能会更加明显。

在 Id 列上创建索引并检查它是否有助于提高查询的性能。

【讨论】:

  • 我得到了同样的结果
  • 那么可能不是查询问题。您能否在表中再添加 20k 和 40k 条记录并运行更新查询?如果查询有问题,查询的性能应该会显着降低。如果它花费几乎相同的时间,那将是其他一些基础设施问题。
  • 完成了我所有其他查询的运行速度都比这个更新查询快于 1.2 秒执行
  • 那么 20k 记录需要 0.5 秒,40k 记录需要 1.2 秒?当 table 有 60k rec 时更新记录需要多少时间?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-14
  • 2015-11-08
  • 1970-01-01
  • 1970-01-01
  • 2020-11-21
  • 2021-01-30
相关资源
最近更新 更多