2014-04-06 50 views
0

我記得在某個地方讀取MySQL的每個表只能使用1個索引來查詢SELECT,但我不知道最新版本的MySQL是否仍然如此。我找不到有關該主題的任何內容。讓MySQL爲每個表使用多個索引

我試圖優化一個有多個索引的表上的查詢,但EXPLAIN表明它只使用其中的一個索引。我嘗試使用FORCE INDEX(index1,index2),但那是行不通的。有沒有辦法強制MySQL在表中使用多個索引?

我正在使用MySQL 5.6.15。

+0

您可以顯示查詢和表定義嗎?讀取兩個索引的 – dethtron5000

+0

表示執行兩個查詢,然後合併結果集將比使用一個索引慢。 – Namphibian

回答

1

基本上,MySql只能從表中檢索行時使用一個索引。

但是,有些特殊情況下,MySql能夠掃描單個表中的多個索引。

這就是所謂的指數合併optimalization和細節是這個鏈接中描述:
http://dev.mysql.com/doc/refman/5.6/en/index-merge-optimization.html

你可以在這個demo

找了幾個基本的例子有在mytable表一對夫婦索引此演示:

create index m_x on mytable(x); 
create index m_y on mytable(y); 

並且有三個查詢(您需要點擊view execution plan個鏈接在本演示中看到自己的expains):

路口接入算法:

select * 
from mytable 
where x = 4 
    and y = 7 
; 
POSSIBLE_KEYS = m_x,m_y 
KEY   = m_x,m_y 
EXTRA   = Using intersect(m_x,m_y); Using where 



聯盟存取算法:

select * 
from mytable 
where x = 5 
    or y = 3 
; 
POSSIBLE_KEYS = m_x,m_y 
KEY   = m_x,m_y 
EXTRA   = Using union(m_x,m_y); Using where 



排序工會接入算法:

select * 
from mytable 
where x > 49 or y < 1 
; 
POSSIBLE_KEYS = m_x,m_y 
KEY   = m_x,m_y 
EXTRA   = Using sort_union(m_x,m_y); Using where 

如果在表上創建了一些索引,那麼MySql會始終嘗試自動應用這些優化,除了創建索引之外,您不需要執行任何特殊的操作來打開它們。
但MySql僅在非常特殊和罕見的情況下才使用這些優化。
在其他情況下,可以使用組合索引(多列中的單個索引)