我正在使用 MySQL 和 Django 框架。 (我打算稍后将MySQL改为 PostgreSQL )
以下是抽象真实数据库的示例案例。
ID
(int(11)
类型):自动增值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...
...
许多行(超过数十万)
每行中10个值中的Column A
值 (301010101,..,301010110)
先按Column A
分组,然后按ID
递减排序。
例如,Models.object.filter(Column A = "301010101").order_by('-id')
对于上述情况,哪个列是最适合索引?
ID
作为索引(默认)
Column A
作为索引
将 ID
和 Column A
一起用作索引(多指数)
我用500000行随机数据测试了它。 (在Meta类中使用`ordering = [' - id']
然后,我测试了查询Models.objects.filter(Column A = "301010101")
ID
作为索引(默认):0.33秒
一起使用 ID
和 Column A
作为索引(多指数):0.12秒
从上面的测试结果中,我确信将ID
和Column A
一起用作多重索引是最优化的情况。
答案 0 :(得分:2)
对于那个“特定”查询,似乎你在(列a,id)上的双列索引上有更好的性能。
从手册:
“如果col1和col2上存在多列索引,则适当 行可以直接获取。如果存在单独的单列索引 在col1和col2上,优化器尝试使用索引合并 优化(参见第8.3.1.4节“索引合并优化”)或 试图通过决定哪个索引来找到最严格的索引 排除更多行并使用该索引获取行“
答案 1 :(得分:0)
如果ID是auto_increment列(我认为它应该是);然后它已被索引。
如果您将Column A
编入索引