我一直在研究索引并试图了解它们是如何工作的以及如何使用它们来提高性能,但我错过了一些东西。
我有下表:
Person:
| Id | Name | Email | Phone |
| 1 | John | E1 | P1 |
| 2 | Max | E2 | P2 |
我正在尝试找到对列进行索引的最佳方法Email
and Phone
考虑到查询(大多数时候)的形式
[1] SELECT * FROM Person WHERE Email = '...' OR Phone = '...'
[2] SELECT * FROM Person WHERE Email = ...
[3] SELECT * FROM Person WHERE Phone = ...
我认为最好的方法是使用两列创建单个索引:
CREATE NONCLUSTERED INDEX [IX_EmailPhone]
ON [dbo].[Person]([Email], [PhoneNumber]);
然而,对于上面的索引,只有查询 [2] 从索引查找中受益,其他查询则使用索引扫描。
我还尝试创建多个索引:一个包含两列,一个用于电子邮件,一个用于电子邮件。在这种情况下,[2]和[3]使用seek,但[1]继续使用scan。
为什么数据库不能使用带有 or 的索引?考虑到查询,该表的最佳索引方法是什么?
使用两个单独的索引,一个在(email)
和一上(phone, email)
.
The OR
是比较困难的。如果您的条件通过以下方式连接AND
而不是OR
,那么您的索引将用于第一个查询(但不是第三个查询,因为phone
不是索引中的第一个键)。
您可以将查询编写为:
SELECT *
FROM Person
WHERE Email = '...'
UNION ALL
SELECT *
FROM Person
WHERE Email <> '...' AND Phone = '...';
SQL Server 应该为每个子查询使用适当的索引。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)