在sql中按ID选择多行的最佳方法是什么?

las*_*shX 23 sql optimization

我需要选择多个记录

我用

SELECT *
FROM `table`
WHERE `ID` =5623
   OR `ID` =5625
   OR `ID` =5628
   OR `ID` =5621
Run Code Online (Sandbox Code Playgroud)

此查询在每秒第二次运行php运行4次

这有更好更快的方法吗?

ant*_*res 57

SELECT *
FROM `table`
where ID in (5263, 5625, 5628, 5621) 
Run Code Online (Sandbox Code Playgroud)

可能更好,但不是更快.

  • 绝对更具可读性。但是,我相信大多数查询优化器都会生成相同的执行计划,这意味着这将与长期使用的方法等效。 (3认同)
  • 我进行了一些测试,发现IN快一点,10或15%.首先,OR的查询更长. (3认同)
  • Anthares,我的测试并不是很遥远,但相对时间在几个不同的情况下是一致的.我无法将结果描述为"主观",但我也不会过多地阅读它们.我个人的习惯和偏好是使用"IN",测试让我放心,使用"OR"显然不是更好.这就是我真正想要的那些测试. (3认同)

Nic*_*ray 7

SELECT *
FROM `table`
WHERE `ID` in (5623, 5625, 5628, 5621)
Run Code Online (Sandbox Code Playgroud)

在进一步研究时,我发现了一篇有趣的博客文章,它解释了如何使用集合从 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
Run Code Online (Sandbox Code Playgroud)


DVK*_*DVK 7

除了人们所说的内容(其中id):

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

2)确保你的表有id的索引

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