关于哪些操作索引效果不佳或未使用

Posted

技术标签:

【中文标题】关于哪些操作索引效果不佳或未使用【英文标题】:On What operations indexs do not work well or are not used 【发布时间】:2010-08-09 06:49:38 【问题描述】:

我正在创建 sql 查询,我在一本书中读到,当使用 NOT 运算符或 LIKE 运算符时,Indexes 不起作用。这句话有多真实。如果陈述是真的,我们如何避免这种情况。应该如何进行查询以完成相同的工作,避免使用这些运算符。

sql server 中索引延迟的所有其他区域。

【问题讨论】:

【参考方案1】:

如果为列定义了一个索引,则使用通配符左侧的语句不能使用索引:

WHERE column LIKE '%abc'
WHERE column LIKE '%abc%'

但其中任何一个都可以使用索引:

WHERE column LIKE 'abc%'
WHERE column LIKE 'abc'

坦率地说,使用 LIKE 进行非常简单的文本搜索 - 如果您确实需要性能良好的文本搜索,请查看全文搜索 (FTS)。全文搜索有自己的索引。

决定真正归结为优化器使用哪个索引,但确保不会使用索引将列值包装在函数调用中的东西。例如,这不会使用索引:

WHERE CHARINDEX(column, 'abc') > 0
WHERE CAST(column AS DATETIME) <= '2010-01-01'

在您操作表数据的任何地方(尤其是更改数据类型)都会使索引变得无用,因为索引是未更改的值,并且无法与更改的数据相关联。

【讨论】:

【参考方案2】:

对于这篇文章的点赞: SQL Performance - Indexes and the LIKE clause

对于 NOT 运算符使用索引将取决于特定的查询。

【讨论】:

【参考方案3】:

查询分析器中有一个名为“显示执行计划”的选项(位于查询下拉菜单中)。如果你打开这个选项,那么每当你在查询分析器中运行一个查询时,你都会得到一个查询执行计划。使用它来分析查询的有效性。根据结果​​,您可能需要使用另一个查询或添加更好的索引。例如。表扫描意味着不使用索引,书签查找意味着你应该限制行或使用覆盖索引,如果有一个过滤器你可能想从 where 子句中删除任何函数调用,排序可能会很慢。

【讨论】:

【参考方案4】:

您需要更深入地探索这个问题的搜索词是 sargable。

这里有一篇文章可以帮助您入门: http://www.sql-server-performance.com/tips/t_sql_where_p2.aspx

【讨论】:

以上是关于关于哪些操作索引效果不佳或未使用的主要内容,如果未能解决你的问题,请参考以下文章

索引处理程序未定义或未导出

关于oracle索引数量

关于MySQL复合索引的使用方法有哪些?

PostgreSQL:未使用的索引导致查询性能不佳?

IntelliJ Maven 错误:存储库是非关联存储库,或未编入索引

ES中的索引生命周期管理