【问题标题】:Why does the "where id in (n1, n2, n3, ..., n2000)" incredibly slow? [duplicate]为什么“where id in (n1, n2, n3, ..., n2000)”速度非常慢? [复制]
【发布时间】:2016-10-19 02:56:10
【问题描述】:

我有一个大约有一亿行的表,列 'id' 是主键,它是表中唯一的键。

我做了如下查询:

SELECT id,name FROM table WHERE id IN (id1, id2, id3, id4, ..., id1000);

“IN”中的这 1000 个 id 实际上是由程序预先计算的 const 整数。

但是 Mysql 每次查询大约需要一分钟。它并不慢,但速度非常慢。条款有什么问题?非常感谢!

表定义:

CREATE TABLE mytable
(
    id mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
    catid smallint(5) unsigned NOT NULL DEFAULT '0',
    name char(39) NOT NULL,
    originalname varchar(255) NOT NULL,
    thumb varchar(255) NOT NULL DEFAULT '',
    description varchar(255) NOT NULL DEFAULT '',
    status tinyint(2) unsigned NOT NULL DEFAULT '1',
    creationtime int(11) unsigned NOT NULL DEFAULT '0',
    updatetime int(11) unsigned NOT NULL DEFAULT '0',
    score int(11) unsigned NOT NULL
    PRIMARY KEY (id)
)
ENGINE=MyISAM
AUTO_INCREMENT=13074618
DEFAULT CHARSET=utf8

【问题讨论】:

  • show create table theTableName 说什么,edit
  • 选项 1:您缺少可用索引
  • 选项 2:表的工作集不适合内存并且必须从磁盘获取(最多 1000 次)
  • 选项 3:您正在使用一个 myisam 表,其中有很多写入(或一些大的慢速写入)会锁定读者
  • CREATE TABLE mytable (id mediumint(8) unsigned NOT NULL AUTO_INCREMENT, catid smallint(5) unsigned NOT NULL DEFAULT '0', name char(39) NOT NULL , originalname varchar(255) NOT NULL, thumb varchar(255) NOT NULL DEFAULT '', description varchar(255) NOT NULL DEFAULT '', status tinyint(2) unsigned NOT NULL DEFAULT '1 ', creationtime int(11) unsigned NOT NULL DEFAULT '0', updatetime int(11) unsigned NOT NULL DEFAULT '0', score int(11) unsigned NOT NULL PRIMARY KEY (id) ENGINE=MyISAM AUTO_INCREMENT=13074618 默认字符集=utf8 |

标签: mysql where-clause


【解决方案1】:

IN 'list' 达到一定大小后,MySQL 会换成TABLE/INDEX SCAN,这有可能非常慢。

您可以重写查询以使用 TEMPORARY TABLE 或 JOIN (SELECT UNION),看看这是否有助于提高性能。

考虑运行EXPLAIN EXTENDED,看看是什么让它变慢了。

【讨论】:

  • IN达到一定大小后在哪里显示?
  • 对不起,我不知道,也不知道如何重写查询以使用临时表。可以提醒一下吗?谢谢。
  • 顺便说一句,这不是一个正确的答案。如果您不知道,请不要发布疯狂的猜测。 :p
  • 来自手册:“[mysql 将进行全表扫描,如果] 您正在将索引列与常量值进行比较,并且 MySQL 已经计算(基于索引树)常量覆盖了太大的部分并且表扫描会更快”
猜你喜欢
  • 1970-01-01
  • 2011-09-02
  • 2021-04-20
  • 2014-05-07
  • 2020-12-16
  • 1970-01-01
  • 2018-08-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多