【问题标题】:MySQL - Does IN() function require full TABLE scan?MySQL - IN() 函数是否需要完整的 TABLE 扫描?
【发布时间】:2011-03-10 06:28:28
【问题描述】:

大家好,我正在做一个需要大量查询的社交网站。我正在使用 1 个包含 IN() 函数的查询。我想知道这是否需要完整的数据库扫描。我不确定是否有任何其他方法可以获得相同的结果。

示例表:

ID | NAME | AGE
05 | Quinton | 25
22 | Stevey | 33
78 | Rebecca | 22
90 | Michael | 26

Query: "SELECT * FROM users WHERE id IN(05,78) ORDER BY id DESC LIMIT 0,2"

这是获取数组中用户列表的最有效方法吗? (使用 PHP)

【问题讨论】:

  • full DBscan 或full Tablescan

标签: php mysql


【解决方案1】:

一般来说 IN 不需要表扫描。如果您在id 列上有索引,MySQL 将能够使用该索引。但是,当您的表中只有 4 行时,执行表扫描通常是最快的,因此在对少量数据进行测试时,您可能会发现在插入更多数据之前没有使用索引。

【讨论】:

  • 大声笑,谢谢,该表将有数百个。并且正在搜索的列被索引。所以只是为了澄清这是最有效的方法吗?
  • @qrpike:是的,应该没问题。如果您想确定,请尝试运行 EXPLAIN SELECT... 并检查实际使用的密钥(如果有)。
  • 他在哪里错过了报价?因为我拼命想弄清楚在哪里却找不到那个地方!
【解决方案2】:

如果您在 ID 字段上有索引,则不需要进行数据库扫描。我假设 ID 字段是主键,这意味着它默认被索引。

【讨论】:

  • 对不起,我的意思是 TABLE 扫描。表中有大约 100k 行,列被索引。
【解决方案3】:

您可以检查额外的WHERE 语句是否加快了处理速度。由于它们是从右到左评估的,因此对最低/最高 id 的限制可能是有益的,例如

SELECT * FROM users WHERE id in(13,18,3456) AND id >= 13 AND id <= 3456

(假设列 id 已编入索引)

【讨论】:

  • 我一定会这样做的!谢谢!
【解决方案4】:

首先Query有错误,应该是

"SELECT * FROM users WHERE id IN(05,78) ORDER BY id DESC LIMIT 0,2"

第二件事,当你使用limit 0,2 那么你为什么要扫描一个完整的表,你可以这样搜索

WHERE id=05 OR id=78 ORDER BY RAND () LIMIT 2

【讨论】:

  • 这只是一个示例查询,而不是网站中的查询。
  • 顺便说一句,查询不需要''围绕值。
猜你喜欢
  • 1970-01-01
  • 2021-05-25
  • 1970-01-01
  • 1970-01-01
  • 2022-06-23
  • 2013-10-09
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
相关资源
最近更新 更多