SQL:什么是索引的好列?

时间:2015-01-17 17:52:17

标签: mysql django postgresql indexing

我正在使用 MySQL Django 框架。 (我打算稍后将MySQL改为 PostgreSQL

以下是抽象真实数据库的示例案例。


列描述

  1. ID int(11)类型):自动增值1

  2. Column A int(10)类型):从10个值中选择

  3. Column B longtext类型):文字字段


  4. 数据行示例

    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...
                   ...
    
    1. 许多行(超过数十万)

    2. 每行中10个值中的Column A (301010101,..,301010110)


    3. 查询用法

      1. 先按Column A分组,然后按ID递减排序。

        例如,Models.object.filter(Column A = "301010101").order_by('-id')


      2. 问题

        对于上述情况,哪个列最适合索引

        1. ID 作为索引(默认)

        2. Column A 作为索引

        3. ID Column A 一起用作索引(多指数)


        4. 编辑:结果

          我用500000行随机数据测试了它。 (在Meta类中使用`ordering = [' - id']

          然后,我测试了查询Models.objects.filter(Column A = "301010101")

          1. ID 作为索引(默认):0.33秒

          2. 一起使用 ID Column A 作为索引(多指数):0.12秒

          3. 从上面的测试结果中,我确信将IDColumn A一起用作多重索引是最优化的情况。

2 个答案:

答案 0 :(得分:2)

对于那个“特定”查询,似乎你在(列a,id)上的双列索引上有更好的性能。

从手册:

  

“如果col1和col2上存在多列索引,则适当   行可以直接获取。如果存在单独的单列索引   在col1和col2上,优化器尝试使用索引合并   优化(参见第8.3.1.4节“索引合并优化”)或   试图通过决定哪个索引来找到最严格的索引   排除更多行并使用该索引获取行“

答案 1 :(得分:0)

如果ID是auto_increment列(我认为它应该是);然后它已被索引。

如果您将Column A编入索引

,这对性能也有帮助