【发布时间】:2017-07-26 15:31:05
【问题描述】:
更新:对于阅读本文的任何人,正如@dnoeth 所述,索引在查询时间方面会产生巨大的差异。在某些情况下,它将行扫描减少到 1 行。您只需选择最适合您的索引风格。 Clustered vs Non Clustered
索引示例:
E.g: create index ix_descr on my_db.media (description asc)
我有一个查询需要很长时间才能运行,它在 where 子句中有很多函数。优化查询的最佳方法是什么?
将函数移出 where 子句并用连接等替换它们?
我在下面给出了几个简单的例子,FIG 2和3是我的优化尝试,让我知道你的想法。
注意*这些不是我实际使用的函数,我使用 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.)(使用连接和区分)
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'
【问题讨论】:
-
为什么投反对票?请详细说明 。我是否应该以不同的方式表达我的问题,以便引出更多的答案而不是意见?
-
添加自联接会增加复杂性,无论条件是在 WHERE 还是 ON 中都没有关系,我怀疑是否有改进,应该是效率较低。更好地索引您的数据。顺便说一句,您可以删除
LENGTH和愚蠢的TRIM(LEFT)并简化为一个条件:WHERE description like "St________" -
@dnoeth 感谢您的建议。
标签: mysql sql query-optimization where-clause