【问题标题】:What is the best way to select multiple rows by ID in sql?在sql中按ID选择多行的最佳方法是什么?
【发布时间】:2011-01-23 16:12:09
【问题描述】:

我需要选择多条记录

我用

SELECT *
FROM `table`
WHERE `ID` =5623
   OR `ID` =5625
   OR `ID` =5628
   OR `ID` =5621

这个查询每秒运行 4 次 php

有没有更好更快的方法呢?

【问题讨论】:

  • 我建议使用索引,它将提高数据库的检索速度。每次运行的ID都不同吗?你能假设身份证上的任何东西吗?数据写入表的频率如何?
  • 为什么需要更快的方法?您的网站是否运行缓慢,或者您是否有其他原因需要找到更快的方法?

标签: sql optimization


【解决方案1】:
SELECT *
FROM `table`
where ID in (5263, 5625, 5628, 5621) 

可能更好,但不会更快。

【讨论】:

  • 你能解释一下你认为这样更好的原因吗?
  • 绝对更具可读性。但是,我相信大多数查询优化器都会生成相同的执行计划,这意味着这将等同于长期方法
  • 我不认为存在性能差异,但它更具可读性和错误证明(如果应该添加额外的过滤器)。
  • 我进行了一些测试,发现 IN 快一点,10% 或 15%。一方面,使用 OR 的查询更长。
  • Anthares,我的测试范围不是很大,但在一些不同的情况下相对时间是一致的。我无法将结果描述为“主观的”,但我也没有过多地阅读它们。我个人的习惯和偏好是使用IN,测试让我确信使用OR 并没有明显好转。这就是我从这些测试中真正想要的。
【解决方案2】:
SELECT *
FROM `table`
WHERE `ID` IN (5623, 5625, 5628, 5621)

但是每秒四次很多。我会考虑另一种需要较少数据库访问的方法。

【讨论】:

  • 不是很多,普通的数据库应该能够在不显着负载的情况下每秒处理 20 倍的查询。您只需要正确设置索引。
  • @dbemerlin:好的,如果你这么说的话。尽管如此,对我来说听起来代码可以改进,而不是一遍又一遍地执行相同的查询。
【解决方案3】:
SELECT *
FROM `table`
WHERE `ID` in (5623, 5625, 5628, 5621)

在进一步研究这一点时,我发现了一个有趣的博客post,它解释了如何使用集合从 In 子句中获得更快的 SQL 性能,方法是将 id 列表创建到公用表表达式 (CTE) 中,然后加入它.

因此,您可以编写与以下等效的 PHP 代码以获得最佳性能。

DECLARE  @idList varchar(256) 
SET @idList = '5623, 5625, 5628, 5621'

;with ids (id) as
(
    SELECT value FROM UTILfn_Split(@idList,',')
)

SELECT     t.* 
FROM     table as t
INNER JOIN    ids
ON        t.ID = ids.id

【讨论】:

  • 如果您有一个逗号分隔的列表作为输入,这可能是一种可行的方法。如果您已经从数字列表开始(如问题所述),将其转换为字符串然后拆分可能会导致过多的开销。我建议坚持使用带有 IN 子句的普通查询。
【解决方案4】:

除了人们所说的(在哪里):

1) 如果有很多 ID,最好将它们粘贴到临时表中并与该临时表运行连接

2) 确保您的表在 id 上有索引

3)如果数据的实时性不重要,将查询结果放在应用端的缓存中

【讨论】:

  • +1 用于缓存。临时表方法需要仔细进行基准测试,因为创建表的开销可能会抵消任何改进。
  • 啊,好吧,那会更好。我仍然赞成你的缓存建议——它提供了一个国家英里的最佳优化。
  • MSSQL 会自动为足够长的 IN 子句创建一个临时表。不确定其他数据库引擎。
【解决方案5】:

如果你这样做

SELECT *
FROM `table`
WHERE `ID` IN (5623, 5625, 5628, 5621)

应该没问题,只要 ID 的数量不要太大。我建议您为 ID 创建一个索引,这样查询会执行得更快。

另外,考虑改变你的逻辑,这样你就不必传递那么多 ID

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-14
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 2017-02-04
    • 1970-01-01
    • 2014-05-27
    • 2019-09-24
    相关资源
    最近更新 更多