SQL : 什么是索引的好列?
SQL : What is a good column for indexing?
我正在使用 MySQL 和 Django 框架。
(我打算稍后将MySQL更改为PostgreSQL)
以下是抽象真实数据库的示例。
列描述
ID
(int(11)
type) : 从 1
自动增加值
Column A
(int(10)
类型):从10个值中选择
Column B
(longtext
类型):文本字段
数据行示例
ID | Column A | Column B
...
21 | 301010101 | TGGQtY84r033i0F6tpx3...
22 | 301010102 | 31TfNgzpxkcuMLxrrZ6D...
23 | 301010103 | U069Z5kG354BwDriFw6d...
24 | 301010107 | d4MSkCBxwZzKusALQAIQ...
25 | 301010105 | R1SJCWeM62P1ikQwmG3f...
26 | 301010103 | bVScBZbf0n1tkdgFCwmD...
27 | 301010102 | 4UpQGyCz5KhlolEdsO8M...
28 | 301010101 | x89gOjNS4J4xiP1DfIWH...
29 | 301010110 | STMlfUwx8afCZBsa8CWJ...
30 | 301010101 | XctEBThnlA5MYTKqycLJ...
31 | 301010104 | fRAEBMXDEdNFn5aENn4r...
31 | 301010105 | GlIwVjVF16WE4zWnnSy8...
...
多行(十万以上)
每行有Column A
个值10个值 (301010101, .., 301010110)
查询使用情况
先按Column A
分组,再按ID
降序排列。
例如,Models.object.filter(Column A = "301010101").order_by('-id')
问题
对于上述情况,哪个列 最适合索引?
ID
作为索引(默认)
Column A
作为索引
使用ID
和Column A
一起作为索引(多索引)
编辑:结果
我用 500000 行随机数据对其进行了测试。 (在 Class Meta 中使用 `ordering=['-id'])
然后,我测试了查询 Models.objects.filter(Column A = "301010101")
ID
作为索引(默认):0.33 秒
使用ID
和Column A
一起作为索引(多索引) : 0.12 秒
从上面的测试结果来看,我确信使用ID
和Column A
作为Multi-index是最优化的情况。
如果 ID 是 auto_increment 列(我认为应该是);那么它已经被索引了。
如果您也为 Column A
编制索引,将有助于提高性能
对于那个 "specific" 查询,您在双列索引上的性能似乎更好,正如所建议的那样,在 (column a,id) 上。
来自手册:
"If a multiple-column index exists on col1 and col2, the appropriate
rows can be fetched directly. If separate single-column indexes exist
on col1 and col2, the optimizer attempts to use the Index Merge
optimization (see Section 8.3.1.4, “Index Merge Optimization”), or
attempts to find the most restrictive index by deciding which index
excludes more rows and using that index to fetch the rows"
我正在使用 MySQL 和 Django 框架。 (我打算稍后将MySQL更改为PostgreSQL)
以下是抽象真实数据库的示例。
列描述
自动增加值ID
(int(11)
type) : 从 1Column A
(int(10)
类型):从10个值中选择Column B
(longtext
类型):文本字段
数据行示例
ID | Column A | Column B
...
21 | 301010101 | TGGQtY84r033i0F6tpx3...
22 | 301010102 | 31TfNgzpxkcuMLxrrZ6D...
23 | 301010103 | U069Z5kG354BwDriFw6d...
24 | 301010107 | d4MSkCBxwZzKusALQAIQ...
25 | 301010105 | R1SJCWeM62P1ikQwmG3f...
26 | 301010103 | bVScBZbf0n1tkdgFCwmD...
27 | 301010102 | 4UpQGyCz5KhlolEdsO8M...
28 | 301010101 | x89gOjNS4J4xiP1DfIWH...
29 | 301010110 | STMlfUwx8afCZBsa8CWJ...
30 | 301010101 | XctEBThnlA5MYTKqycLJ...
31 | 301010104 | fRAEBMXDEdNFn5aENn4r...
31 | 301010105 | GlIwVjVF16WE4zWnnSy8...
...
多行(十万以上)
每行有
Column A
个值10个值 (301010101, .., 301010110)
查询使用情况
先按
Column A
分组,再按ID
降序排列。例如,
Models.object.filter(Column A = "301010101").order_by('-id')
问题
对于上述情况,哪个列 最适合索引?
ID
作为索引(默认)Column A
作为索引使用
ID
和Column A
一起作为索引(多索引)
编辑:结果
我用 500000 行随机数据对其进行了测试。 (在 Class Meta 中使用 `ordering=['-id'])
然后,我测试了查询 Models.objects.filter(Column A = "301010101")
ID
作为索引(默认):0.33 秒使用
ID
和Column A
一起作为索引(多索引) : 0.12 秒
从上面的测试结果来看,我确信使用ID
和Column A
作为Multi-index是最优化的情况。
如果 ID 是 auto_increment 列(我认为应该是);那么它已经被索引了。
如果您也为 Column A
编制索引,将有助于提高性能
对于那个 "specific" 查询,您在双列索引上的性能似乎更好,正如所建议的那样,在 (column a,id) 上。
来自手册:
"If a multiple-column index exists on col1 and col2, the appropriate rows can be fetched directly. If separate single-column indexes exist on col1 and col2, the optimizer attempts to use the Index Merge optimization (see Section 8.3.1.4, “Index Merge Optimization”), or attempts to find the most restrictive index by deciding which index excludes more rows and using that index to fetch the rows"