WHERE 子句中首选哪个:'wild cards' 或 'String Functions'?
Which one is preffered in a WHERE clause: 'wild cards' or 'String Functions'?
我知道必须尽可能避免在 WHERE 子句中使用通配符和函数。我的问题是:假设我们必须在其中之一之间进行选择,那么哪一个在性能方面更好?更具体地说,我有以下两个查询,我想知道一般首选哪种类型的查询:
select FirstName from person.person where FirstName like 'S%'
select FirstName from person.person where LEFT(FirstName,1) = 'S'
PS。我检查了两个查询的执行时间,在这个特定情况下没有明显差异。以下是执行计划:
这是为索引IX_Person_LastName_FirstName_MiddleName定义的代码:
USE [AdventureWorks2012]
GO
/****** Object: Index [IX_Person_LastName_FirstName_MiddleName] Script Date: 11/30/2016 12:53:05 PM ******/
CREATE NONCLUSTERED INDEX [IX_Person_LastName_FirstName_MiddleName] ON [Person].[Person]
(
[LastName] ASC,
[FirstName] ASC,
[MiddleName] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO;
这是我找到的一些关于这个问题的链接,尽管它们没有完全回答我的问题:
AvoidFunctionsInWereClause_1
AvoidLikeClause
两个查询都在进行索引扫描,所以没问题。但我们不知道您如何设置索引或 table 大小。
第一个版本可以在 firstName 上使用基本索引,因为 %
在末尾。
FirstName like 'S%'
FirstName Like '%S%' -- cant use index
第二版不能使用 firstName 的索引,但您可以为 LEFT(FirstName,1)
创建一个计算索引,这就是为什么您应该向我们展示您的索引。
这篇文章有创建索引的最佳技巧。 MySQL索引TIPS
我知道必须尽可能避免在 WHERE 子句中使用通配符和函数。我的问题是:假设我们必须在其中之一之间进行选择,那么哪一个在性能方面更好?更具体地说,我有以下两个查询,我想知道一般首选哪种类型的查询:
select FirstName from person.person where FirstName like 'S%'
select FirstName from person.person where LEFT(FirstName,1) = 'S'
PS。我检查了两个查询的执行时间,在这个特定情况下没有明显差异。以下是执行计划:
这是为索引IX_Person_LastName_FirstName_MiddleName定义的代码:
USE [AdventureWorks2012]
GO
/****** Object: Index [IX_Person_LastName_FirstName_MiddleName] Script Date: 11/30/2016 12:53:05 PM ******/
CREATE NONCLUSTERED INDEX [IX_Person_LastName_FirstName_MiddleName] ON [Person].[Person]
(
[LastName] ASC,
[FirstName] ASC,
[MiddleName] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO;
这是我找到的一些关于这个问题的链接,尽管它们没有完全回答我的问题:
AvoidFunctionsInWereClause_1
AvoidLikeClause
两个查询都在进行索引扫描,所以没问题。但我们不知道您如何设置索引或 table 大小。
第一个版本可以在 firstName 上使用基本索引,因为 %
在末尾。
FirstName like 'S%'
FirstName Like '%S%' -- cant use index
第二版不能使用 firstName 的索引,但您可以为 LEFT(FirstName,1)
创建一个计算索引,这就是为什么您应该向我们展示您的索引。
这篇文章有创建索引的最佳技巧。 MySQL索引TIPS