单列或复合索引

时间:2017-04-19 12:41:13

标签: mysql sql indexing

对于像这样的表

[  col1   -   col2   -   col3   -   col4 ]
[    1    -     2    -     3     -    4  ]

我将在两种情况下使用两种类型的查询

一个是SELECT * FROM table WHERE col1 = 1 AND col2 = 2 AND col3 = 3;

另一个是SELECT * FROM table WHERE col1 = 1 AND col2 = 2 AND col4 = 4;

在这种情况下,我做一个

composite index仅适用于col1 AND col2single-column index适用于col3 AND col4

或者我去

ALLsingle-column index

或放

ALL composite index

中的列

附带问题:我必须为索引命名吗?什么是指数大小?

2 个答案:

答案 0 :(得分:0)

col1和col2上的复合索引,col3和col4上的单列索引可能最佳。但要确定的方法是构建一个测试表,并用样本数据填充它。如果可能,请在生产中插入大致相同数量的数据。

然后构建索引,运行查询并阅读执行计划。删除索引,以不同的方式构建它们,运行查询,并阅读执行计划。

您还应该考虑其他查询需要使用此表,以及索引如何影响这些查询。考虑INSERT和DELETE查询以及SELECT语句。

是否必须为索引命名取决于dbms。如果你把它留下来,他们中的大多数将提供系统生成的名称。索引的大小取决于dbms;如果dbms没有提供显式函数或存储过程来解决这个问题,通常可以找到它。

答案 1 :(得分:0)

有这两个:

INDEX col123 (col1, col2, col3),
INDEX col214 (col2, col1, col4)

注意:

  • 对于给出的2个查询,3列在复合查询中的顺序无关紧要。
  • 我在不同的订单中执行了col1和col2,以防某些其他查询需要col2而没有col1
  • INDEX(col3)(单列)不太有用。
  • 使用INDEX(col1, col2), INDEX(col3) - 优化器将选择一个索引而不使用另一个索引。这比拥有所有三列的索引要好。
  • 卢克很好; my index cookbook可能会更好吗?
  • "经验法则"针对Postgres。 使用它们;有太多东西对MySQL不正确。
  • "查询调优" link是针对DB2的; 主要是适用于MySQL。
  • INSERTs确实需要一点时间来更新索引,但大部分工作都会延迟(请参阅"更改缓冲")以获取非UNIQUE索引。不要让它阻止你添加索引。 SELECT 通常的好处远远超过INSERT中的费用。
  • 索引名称在MySQL中是可选的,但复合索引的默认值可能会产生误导。

比较查询和/或索引的另一种方法,即使行数太少也无法获得可靠的时间:

FLUSH STATUS;
SELECT ...;
SHOW SESSION STATUS LIKE 'Handler%';

大数字=坏;小数字=微笑。