1

我需要从具有 VARCHAR 主键索引 ID 的 mysql 表中选择某些行。

因此,我使用了一个查询(但显然是 13,000 个 id 而不是 3 个)

SELECT * FROM table1 WHERE ID IN ('id1928383','id3838339','id38383')

对于大多数表来说,这很好用(~0.2s),但对于某些表来说,查询需要更长的时间(~10-11s)。

不起作用的表的唯一不同之处是它们的 Data_length 更大?有什么想法可以加快慢速查询的速度吗?

4

3 回答 3

1

查找 13,000 行需要实时时间。对于每个值,它必须:

  1. 处理索引以找到记录位置
  2. 将页面加载到页面缓存中
  3. 返回结果

或者,它可能会进行表扫描以单独读取每一行并与列表进行比较。您能否提供长期运行版本的说明以确定使用哪种方法。

如果在索引中查找值,我的猜测是大表不适合页面缓存。这会导致大多数值的额外读取页面命中。

最简单的解决方案是增加页面缓存的大小。您也可以尝试将所有 id 放入一个临时表并将其连接到更大的表中。这样做时,在临时表上建立索引会特别有帮助。

于 2013-01-31T14:33:26.197 回答
1

你可以做一些事情来加快这个查询:

  • 使用而INT不是VARCHARID

一般来说,计算机处理数字要比处理字符串好得多,因此这将大大加快速度。

  • 添加ID作为索引。

这将使用该索引列创建一个有序表,其中搜索和排序将快很多。

  • 使用 PDO

如果你在 PHP 中使用它,我建议你使用 PDO,因为它有一个查询缓存系统,并且如果有许多相同的查询正在运行,它可以显着改善结果。我想其他编程语言也有类似的机制。

  • 升级 MySQL

对于您使用的所有软件,出于多种原因,建议您使用最新版本。如果我没记错的话,IN在旧版本的 MySQL 中存在性能问题,后来修复了几个版本,但你可能是仍然使用该版本的少数不幸的人之一。


这就是我能提供的帮助,如果您需要更多帮助,您需要发布更多信息(表结构、数据库结构、编程语言等)。

于 2013-01-31T14:40:44.560 回答
0

确保所有id列都已编入索引。

于 2013-01-31T14:08:40.100 回答