慢查询从mysql数据库中选择13,000行

时间:2013-01-31 14:06:58

标签: mysql

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

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

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

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

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

3 个答案:

答案 0 :(得分:1)

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

  1. 处理索引以查找记录位置
  2. 将页面加载到页面缓存中
  3. 返回结果
  4. 或者,它可能正在进行表扫描以单独读取每一行并与列表进行比较。您能否提供长期运行版本的说明,以确定使用哪种方法。

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

    最简单的解决方案是增加页面缓存的大小。您也可以尝试将所有ID放入临时表并将其连接到较大的表。执行此操作时,在临时表上构建索引会特别有用。

答案 1 :(得分:1)

您可以采取一些措施来加快此查询:

  • INT列使用VARCHAR代替ID

计算机通常使用数字比使用字符串要好得多,因此这会大大加快它的速度。

  • ID添加为索引。

这将创建一个带有索引列的有序表,其中搜索和排序将更快。

  • 使用PDO

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

  • 升级MySQL

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


这就像我可以提供帮助一样多,如果你需要更多帮助,你需要发布更多信息(表结构,数据库结构,编程语言等)。

答案 2 :(得分:0)

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