2017-04-19 55 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,或者只是一個重要的行使用很多? –