如何使用WHERE子句优化SQL查询

3

我有一个非常简单的查询。

SELECT top 100 *
FROM logs
WHERE description LIKE '%5488826%'
ORDER BY id DESC

然而,它包含一个LIKE子句,用于搜索一个较大的文本字段。
我知道这个表只有(例如)200200行。
(我只对查找在行ID>200000的内容感兴趣。)
我试图通过添加来优化查询。
 SELECT top 100 *
 FROM logs
 WHERE  ID > 200000 
 AND description LIKE '%5488826%'
 ORDER BY id DESC

我的想法是,SQL会先运行ID > 200000约束条件,这将有助于加速查询,但它仍需要几分钟才能运行。我该怎么做才能使其运行更快?
编辑: ID是主键并已建立索引。

EXPLAIN 能给你什么信息?如果你真的有 200200 行,你会认为优化器确实会按照你的建议执行,这可能需要一秒钟左右的时间。(除非“相当大”意味着“兆字节”) - lc.
  1. 你使用的是哪种数据库管理系统?
  2. 展示一下你的执行计划输出。
- Kirill Leontev
我在使用MS SQL Server,我猜EXPLAIN是查询分析器,我会去查一下... - Ian G
如果您没有索引(并且似乎您没有使用它们),那么您需要阅读MSDN上的这篇文章 - Nikola Markovinović
2
请发布执行计划。假设ID是聚集索引,我本来期望它只会反向扫描并在找到100个匹配行或达到ID范围的末尾时停止。也许延迟是由于其他原因(例如长时间开放事务的阻塞)造成的。 - Martin Smith
在查询方面,你有两个“罪恶”:(1)使用 LIKE '%....%' 会使SQL Server无法使用任何索引,(2)使用SELECT *也意味着SQL Server很可能需要扫描整个聚集索引(基本上是一个表扫描)来获取你的数据。没有办法优化 这个 - 你需要重写这个查询语句。 - marc_s
4个回答

3

您可以尝试创建一个仅包含id > 200000的条目的临时表,并查询该表以查看是否有任何差异:

SELECT * INTO #temp FROM logs WHERE id > 200000;

SELECT * FROM #temp WHERE description LIKE '%5488824%' ORDER BY id DESC;

0

请看看这个是否有效:

SELECT top 100 * from
(select description FROM logs  WHERE  ID > 200000 )  s
where s.description LIKE '%5488826%'  
ORDER BY s.id DESC  

0

我会先尝试子查询约束。根据你使用的数据库,你可以尝试类似以下的语句:

SELECT TOP 100 * FROM (
SELECT ID, description FROM logs WHERE ID > 200000
) AS data
JOIN
   logs 
ON
   logs.id = data.id
WHERE
   data.description LIKE '%5488826%'
ORDER BY
   ID DESC

或者(对于 SQL Server -- 使用 CTE 和 read uncommitted 提示):

;WITH data AS (
    SELECT ID, description FROM logs WITH (NOLOCK) WHERE ID > 200000
)
SELECT
  logs.*
FROM
  data 
  JOIN
    logs WITH (NOLOCK)
  ON
    logs.id = data.id
WHERE
  data.description LIKE '%5488826%'

并确保你在id列上有索引。


-1
非常简短的答案;-)将索引添加到列中。

1
请解释为什么索引可以帮助优化每个列? - Grzegorz Gierlik
2
我喜欢你们在没有看到实际执行计划的情况下提出查询调优建议的方式 ;) - Kirill Leontev
哦,我的意思是:给“id”和“description”列添加索引。 - Tom Maier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接