【问题标题】:SQL : What is a good column for indexing?SQL:什么是索引的好列?
【发布时间】:2015-03-16 03:31:59
【问题描述】:

我将 MySQLDjango 框架一起使用。 (我计划稍后将 MySQL 更改为 PostgreSQL

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


栏目说明

  1. ID(int(11) type) : 从 1 开始的自动递增值

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

  3. Column Blongtext 类型):文本字段


数据行示例

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. 每一行都有Column A在10个值中 (301010101, .., 301010110)


查询使用情况

  1. 先按Column A分组,再按ID降序排列。

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


问题

对于上述情况,哪一列将是最适合索引

  1. ID 作为索引(默认)

  2. Column A 作为索引

  3. 同时使用 IDColumn A 作为索引(多索引)


编辑:结果

我用 500000 行随机数据对其进行了测试。 (在 Class Meta 中使用 `ordering=['-id'])

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

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

  2. 同时使用 IDColumn A 作为索引(多索引):0.12 秒

从上面的测试结果,我确信IDColumn A一起作为Multi-index是最优化的情况。

【问题讨论】:

  • 对于您的第一个条件,(ColumnA,id) 上的组合索引会有所帮助。直接在 mysql 中使用 EXPLAIN 对其进行测试。但考虑到选择,我猜 2
  • 按照您的建议,我自己用 500000 行随机数据对其进行了测试。结果是,将IDColumn A 一起用作索引是最快的情况。

标签: mysql django postgresql indexing


【解决方案1】:

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

来自手册:

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

【讨论】:

  • 在按“a 列”和“id”过滤时,不会只使用(a 列,id)上的索引(提高速度)吗?即Models.object.filter(Column A = "301010101", id=12)
  • 据我了解,该查询中通过“order by”子句使用了“id”列
  • 感谢您的回答。我还有一个问题。假设该表已按-id(元类中的ordering=['-id;])排序。在这种情况下,我们不必查询order_by('-id')。那么,单个索引为Column A 可以吗?
  • 这是个好问题。至于“良好实践”,我个人永远不会“假设”数据库有任何东西。如果您将表本身的顺序作为默认的“order by”,而查询中不包含所需的“order by”将是一个假设,在这种情况下。以下链接对默认顺序的假设进行了一些很好的讨论:stackoverflow.com/questions/8746519/…
【解决方案2】:

如果 ID 是一个 auto_increment 列(我认为应该是);那么它已经被索引了。

如果您也将Column A 编入索引,这将有助于提高性能

【讨论】:

    猜你喜欢
    • 2011-02-26
    • 1970-01-01
    • 2018-04-11
    • 1970-01-01
    • 2011-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-17
    相关资源
    最近更新 更多