【问题标题】:Optimize large MySQL SELECT WHERE IN statement优化大型 MySQL SELECT WHERE IN 语句
【发布时间】:2014-07-12 23:00:56
【问题描述】:

我需要在 MySQL 上执行大型 SELECT WHERE IN 查询,并且我需要它快速运行。我有一个超过 1 亿行的表,主键在 varchar 127 上(必须是这样)。

我正在执行 SELECT col1 FROM table WHERE col1 IN ($in) 其中 $in 有 5000 个值。我基本上只需要在主键 col1 的表中找到 5,000 个值中的哪一个。

查询通常需要 1 到 10 秒,但通常约为 7 或 8 秒。

有没有一种更优化、更快速的方法来对由 varchar 索引的大型表执行带有大型 IN 子句的 SELECTS?

我在带有 PHP 和 PDO 的专用服务器上使用 InnoDB。感谢您的建议。

【问题讨论】:

  • 您是否尝试将$IN 变量中的值放入临时表中,并以主键作为值?加入此表可能有助于提高性能。另外,返回多少行?如果结果集非常大,则可能会花费时间来检索数据而不是生成结果集。
  • 这些值是任意的吗?换句话说,可以在 WHERE AND 值的开头添加
  • Gordon,我没有尝试过,需要为我详细说明的步骤,因为我对大型 mysql 表比较陌生。在 5,000 个中,通常返回 1,000 到 5,000 个之间的任何值,这是一个相当大的返回集。
  • Mihai,是的,这些值是任意的,并且分散在整个表格中。

标签: php mysql sql pdo


【解决方案1】:

评论有点长。

我猜你已经在table(col1) 上有一个索引,否则查询可能需要超过 10 秒。如果这不是真的,那么添加一列。更好的是,将列设为主键。

我怀疑索引不适合内存。为此,您需要找到一个 MySQL DBA(如果您有这么大的表,您应该有)或了解 MySQL 的内存选项。不适合内存的索引会表现出这种行为。

如果这是真的,那么行为应该是相当线性的。因此,如果您有一个包含 500 个 id 的列表,它应该需要大约一秒钟或更短的时间。如果你有 50 个 id,那么十分之一秒左右。

在这种情况下,对 id 列表进行排序可能会有所帮助。不过,这只是我个人的猜测。

【讨论】:

  • 是的,我应该提到它是桌子上的主键。我想索引可能不适合内存,有没有办法检查是否是这种情况?关于在哪里学习 mysql 的内存选项的任何指针?最后,表中的 ID 按字母顺序排序,但 IN 子句不是 - 这就是您的建议吗?
  • @Guy 。 . .如果col1 是主键,则尝试在in 语句中对id 进行排序。如果 MySQL 正在逐一检查它们并且索引不适合内存,那么这可能会提高性能。
猜你喜欢
  • 2010-12-07
  • 2016-12-29
  • 2011-11-24
  • 1970-01-01
  • 1970-01-01
  • 2011-01-12
  • 2016-06-02
  • 2020-07-29
  • 2021-12-23
相关资源
最近更新 更多