gpt4 book ai didi

mysql - 查询优化(MySql/Sql): Moving functions out of where clause

转载 作者:行者123 更新时间:2023-11-29 18:35:38 25 4
gpt4 key购买 nike

更新:对于阅读本文的任何人来说,正如@dnoeth 下面所述,索引在查询时间方面会产生巨大的差异。在某些情况下,它将行扫描减少到 1 行。您只需选择最适合您的索引风格即可。 Clustered vs Non Clustered

索引示例:

E.g: create index ix_descr on my_db.media (description asc)
<小时/>

我有一个需要很长时间才能运行的查询,它在 where 子句中有相当多的函数。优化查询的最佳方法是什么?

将函数移出 where 子句并用连接等替换它们?

下面我举了几个简单的例子,图23是我的优化尝试,请告诉我你的想法。

注意*这些不是我正在使用的实际函数,我使用 dbo.DecryptBlob(m.mediaId) 等。我选择使用下面的函数以使问题更容易理解。

图 1.)

SELECT 
description, id
FROM
my_db.media
where
length(description) = 10
and description like "S%"
and trim(left(m.description,2)) = 'St'
<小时/>

可能的优化

图 2.)(使用 join 和 group by)

SELECT
m.description, m.mediaId
FROM
my_db.media m
inner JOIN
my_db.media m1 ON length(m.description) = 10
and m.description like "S%"
and trim(left(m.description,2)) = 'St'
group by m.mediaId

图 3.)(使用 join 和distinct)

SELECT distinct
m.description, m.mediaId
FROM
my_db.media m
inner JOIN
my_db.media m1 ON length(m.description) = 10
and m.description like "S%"
and trim(left(m.description,2)) = 'St'

最佳答案

我将您的起始评论表述为“不要隐藏函数内的索引列,优化器无法找到它来使用 INDEX。”

and description like "S%"
and trim(left(m.description,2)) = 'St'

相同
and description LIKE "St%"

有了这个,INDEX(description) 就会很好地工作。对 length=10 的检查是次要的,并不是真正的问题。它将对该索引进行“范围”扫描。 (如果您的意思不是“2”和“St”,那么我的评论可能不适用。)

TRIM -- 清理输入,而不是在 SELECT 期间尝试执行此操作。

在这种情况下,使用 JOIN 将显示内容。

SELECT 列表中未指定 mediaId 的情况下执行 group by m.mediaId 是“错误”的。所以,我不知道你在图2中的目的是什么。

关于mysql - 查询优化(MySql/Sql): Moving functions out of where clause,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45331428/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com