回答

收藏

索引实际上可以降低SELECT性能吗?

技术问答 技术问答 253 人阅读 | 0 人回复 | 2023-09-13

在阅读了有关SQLServer索引及其对选择的性能优势和对更新/插入的劣势的一些知识之后,我想知道使用不当的索引是否实际上还会损害选择的性能。要使索引降低纯选择查询的性能,必须满足哪些条件?是否存在这种情况?# u& A) K3 N  ]$ ~) g5 |5 ?
谢谢!
1 V4 Z2 j5 f; f/ J7 z% B(尽管我总是尝试包含代码示例,但我想不出任何可以支持此问题的东西…)$ ~8 C2 _- }2 }/ `
               
" W4 \, x7 F( t. q- }# R- o8 W% q解决方案:* O% B8 c6 M' I, j/ u) |# W% ^
               
* t) x- n# W- E5 n
. f5 a! F) \: T9 C3 j; T9 E
7 t" v/ H% e7 F& v7 i  e$ N' L                是的,尽管非常微小-如此微小,以至于也回答“否”是合理的。
$ y; e) m4 o8 V0 }2 P8 U如果您有一个 可能8 ]0 e7 a! b, E: F
被查询但无法使用的索引,那么优化器将浪费一小段时间来考虑是否以及如何使用它(在极少数情况下,具有非常复杂的索引和视图,并且在出现索引性能提示时更为频繁)是错误的,您最终可能会选择次优的查询计划)。
5 b( ?+ r" R& Q2 _; m% L4 `0 e一些情况是:
+ O' c& N3 `2 k4 V3 |没有索引的表
2 S; Y# e, h, L* X$ V4 q5 E具有错误选择索引的表,该表将被丢弃
& q9 M4 h" d1 ]3 O% j9 W在存在两个索引的表中,由于某种原因(例如过时的统计信息),第二个索引的存在使优化器选择它,而使用第一个索引会更方便。
0 ]* d4 r) ^  d! ]* j9 _6 V
' r7 X* D; y2 Z( b8 O( p' N! i4 v
在前两种情况下,查询时间是相同的(并且需要进行全面扫描),但是在第二种情况下,还必须分析并丢弃索引。5 Y0 I9 \* D$ N6 V  ^5 S, v; u
索引会伤害您-所有索引都会伤害您-在插入,删除和更新中。然后,未由更新查询使用但受其影响的任何索引都将需要对索引本身进行写操作。2 K9 B) X* R# L. J
因此,您将希望 拥有
$ M5 k, J8 F# {9 F6 l索引,但要在不牺牲SELECT性能的情况下尽量减少索引。实际上,您可能决定不为很少使用的SELECT查询建立索引,以避免所有其他UPDATE查询不断更新所需的索引。4 G' C7 A. C; R* y# t3 r
编辑:在阅读Heinzi的答案之后,我还要补充一点,大多数数据库服务器都具有维护工具,这些工具可以分析表和索引(有时还查询性能计数器),并适当地更新Heinzi所说的提示。因此,定期“维护”数据库以使优化器提供有关从中选择索引的最新信息也很重要。
# Z& Q7 h- X1 u1 B- y/ r6 D1 D4 ^更新(MySQL)3 w8 X! z: X2 D. [$ ]* U- s* j
有一个非常漂亮的MySQL分析工具,可以实际 建议1 d4 Y( n8 {& Q/ W6 I. U2 q7 E& W
对现有索引进行改进(删除未使用的键,添加有用的键):common_schema。真的值得一看。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则