2017-04-19 53 views
2

对于这样单柱或复合指数

[ 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 indexcol1 AND col2col3 AND col4

一个single-column index还是我去

ALLsingle-column index

或把

ALL列在composite index

边问:我有命名索引?什么是索引大小?

+0

@a_horse_with_no_name mysql –

回答

0

有两个:

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

注:

  • 对于给定的2个查询,它并不重要订购3列是在复合查询。
  • 我以不同的顺序做了col1和col2,以防万一其他查询需要col2没有col1
  • INDEX(col3)(单列)不太有用。
  • With INDEX(col1, col2), INDEX(col3) - 优化器将选择一个索引而不使用其他索引。这比具有全部三列的索引要好。
  • 卢克很好; my index cookbook可能会更好?
  • “经验法则”针对Postgres。做不是使用它们;有太多对MySQL不正确的东西。
  • “查询调整”链接针对DB2;它主要是适用于MySQL。
  • INSERTs确实需要一些时间来更新索引,但大部分工作都会延迟(请参阅“更改缓冲”)非独特索引。不要让它阻止您添加索引。在SELECT通常的好处远远超过INSERT的成本。
  • 索引名称在MySQL中是可选的,但复合索引的默认值可能会引起误解。

另一种方式来比较查询和/或索引,甚至太少行获得可靠的计时:

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

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

0

col1和col2上的复合索引,col3和col4上的单列索引为,可能的效果最好。但要确定的方法是构建一个用于测试的表格,并用样本数据填充它。如果可能的话,插入大致相同数量的您期望的数据。

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

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

是否必须命名索引取决于dbms。他们中的大多数将提供一个系统生成的名字,如果你不提供它。索引的大小取决于dbms;如果dbms没有提供显式函数或存储过程来做到这一点,通常有办法解决这个问题。

+0

索引如何影响INSERT?我认为这是关于UPDATE和SELECT –

+0

@CaliburVictorious:插入行时,必须更新表的部分或全部索引。这*通常*不是问题,但确实需要更多时间。更多的索引,更多的时间。索引中有更多的列,更多的时间。有些应用程序可能对时间的增加非常敏感。 –

+0

那么你可以告诉我,我通常需要索引什么类型的行,什么不索引?因为我用例如从1到4行来获取一些数据但更新它我使用1,并插入我使用1到3,在这种情况下索引所有行如果超过1,或者只是一个重要的行使用很多? –