我知道如果可能的话,必须在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;
以下是我发现的有关此问题的一些链接,但它们并未完全回答我的问题:
答案 0 :(得分:1)
两个查询都在进行索引扫描,所以这些都没问题。但我们不知道您如何设置索引或表格大小。
第一个版本可以在firstName上使用基本索引,因为%
在最后。
FirstName like 'S%'
FirstName Like '%S%' -- cant use index
第二版 cant 使用firstName上的索引,但您可以为LEFT(FirstName,1)
创建计算索引,这就是您应该向我们展示索引的原因。
这篇文章有创建索引的最佳提示。 MySQL索引TIPS