【发布时间】:2016-11-29 19:50:54
【问题描述】:
我一直在研究索引并试图了解它们的工作原理以及如何使用它们来提高性能,但我遗漏了一些东西。
我有下表:
人物:
| Id | Name | Email | Phone |
| 1 | John | E1 | P1 |
| 2 | Max | E2 | P2 |
考虑到查询(大部分时间)将采用以下形式,我正在尝试找到索引列 Email 和 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 的索引?考虑到查询,该表的最佳索引方法是什么?
【问题讨论】:
-
这也取决于每个查询返回多少行。如果 (1) 旨在返回 50% 的表,那么扫描听起来不错,因为您也在使用
SELECT *,所以无论如何它都需要返回表以获取其他列 -
我的错误,我实际上并没有使用 *,我只是用它来简化代码。但是,我选择了所有列。会有这么大的不同吗?
-
使用
SELECT *只是使用SELECT <list every column here>的捷径,所以参数是一样的 -
关于您的第一条评论,这意味着根据统计数据可能会或可能不会使用undex?
-
使用具有该行数的索引是没有意义的。只进行表扫描几乎总是更好(除非您使用的是
SELECT [a column that's in the index]。表中的行太少
标签: sql sql-server indexing