【发布时间】:2015-03-16 03:31:59
【问题描述】:
我将 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是最优化的情况。
【问题讨论】:
-
对于您的第一个条件,
(ColumnA,id)上的组合索引会有所帮助。直接在 mysql 中使用 EXPLAIN 对其进行测试。但考虑到选择,我猜 2 -
按照您的建议,我自己用 500000 行随机数据对其进行了测试。结果是,将
ID和Column A一起用作索引是最快的情况。
标签: mysql django postgresql indexing