您需要为出现在WHERE 子句中的列创建索引。该规则有几个例外:
- 如果列只有一个或两个唯一值(这方面的典型示例是“性别” - 只有“男性”和“女性”是可能的值,这里没有指向索引的意义)。通常,您需要一个能够将需要处理的行限制为显着数量的索引(例如,仅将搜索空间减少 50% 的索引不值得,但将其减少 99 % 是)。
- 如果您要搜索
x LIKE '%something',那么索引就没有意义了。如果您认为索引为行指定特定的顺序,那么如果您正在搜索“%something”,则按x 排序是没有用的:您将不得不扫描所有行无论如何。
让我们看一下您正在搜索“关键字'会计'”的情况。根据您的结果页面,生成的 SQL 是:
SELECT
*
FROM (
SELECT TOP 10
ROW_NUMBER() OVER (ORDER BY sq.name) AS Row,
sq.*
FROM (
SELECT
c.*,
p.providername,
p.school,
p.website,
p.type
FROM
cpd_COURSES c, cpd_PROVIDERS p
WHERE
c.providerid = p.providerid AND
c.activatedYN = 'Y' AND
(
c.name like '%accounting%' OR
c.title like '%accounting%' OR
c.keywords like '%accounting%'
)
) sq
) AS temp
WHERE
Row >= 1 AND Row <= 10
在这种情况下,我假设cpd_COURSES.providerid 是cpd_PROVIDERS.providerid 的外键,在这种情况下您不需要索引,因为它已经有一个。
此外,activatedYN 列是 T/F 列,并且(根据我上面关于将可能值限制为仅 50% 的规则)T/F 列也不应该被索引。
最后,因为使用 x LIKE '%accounting%' 查询进行搜索,您也不需要名称、标题或关键字的索引 - 因为它永远不会被使用。
所以在这种情况下您需要做的主要事情是确保cpd_COURSES.providerid 实际上是 cpd_PROVIDERS.providerid 的外键。
SQL Server 特定
由于您使用的是 SQL Server,因此 Management Studio 提供了许多工具来帮助您决定需要在哪里放置索引。如果您使用“索引调整向导”,它实际上通常很擅长告诉您什么会给您带来良好的性能改进。您只需将您的查询剪切并粘贴到其中,它就会返回有关要添加的索引的建议。
您仍然需要对添加的索引有点小心,因为您拥有的索引越多,INSERTs 和 UPDATEs 的速度就越慢。因此,有时您需要整合索引,或者如果它们不能提供足够的性能优势,则完全忽略它们。需要一些判断。