sql - 多列索引的顺序重要吗?
问题描述
我明白为什么索引很重要。我理解为什么仅使用多列索引中的几列进行查询时顺序很重要。我不明白为什么似乎有一个经验法则可以从最大到最小基数/选择性进行排序。我看不出任何性能提升会从何而来,而且我发现了相互矛盾的结果。
在上面的链接中,最佳答案似乎真的没有意义。我认为无论您执行二进制搜索操作的顺序如何,都需要同样多的步骤才能找到正确的组合。
假设我有下表:
A B
-- --
1 a
2 a
3 a
4 a
5 b
6 b
7 b
8 b
假设我正在寻找(1,a)。如果我首先在 A 列上执行二进制搜索,我需要三个步骤来获得“1”,然后“a”是给定的。如果我首先对 B 列执行二进制搜索,我需要 1 步将结果缩小到“a”,然后再执行 2 步才能得到“1”(对数字 1-4 进行二进制搜索)。无论哪种方式,我都在执行相同数量的步骤(总共 3 个),对吧?
除此之外,最后 3 个答案说,当搜索查询中提供所有列时,顺序无关紧要。
在上面的链接中,最重要的答案表明应将具有 LEAST 不同值的列放在首位。事实上,这对我来说更有意义,因为跳过读取似乎实际上提高了性能。(如果有人可以对我进行 Eli5 索引压缩,那就太好了。)
但是,链接到Oracle 文档的最后一个答案明确指出,从最具选择性到最不具有选择性的排序可以提高查询性能。
这一切都假设我将在索引中的不同列上称为逐层二进制搜索(我读过的多个来源都说不会发生)。
那我该相信什么?
解决方案
推荐阅读
- android - Unable to open debugger port (8600) Android Studio in MAC
- python - Combining rows from one excel to another in a specific location
- python - 在 DataFrame 上应用具有多个参数的滚动函数
- angular - How to fix the duplication of my arrays from the form inputs
- android - FirebaseFirestore 未执行给定的查询
- typescript - 节点模块 Typescript 类实例类型检查
- flutter - 在颤振应用程序的后台运行特定功能
- javascript - JavaScript - 如何为 Socket.io 事件创建自定义 API 侦听器?
- c# - 如何获取 Elasticsearch NEST 响应的聚合类属性?
- sql - Oracle to Sql server:如何重现这个 select 语句?