我記得在某個地方讀取MySQL的每個表只能使用1個索引來查詢SELECT
,但我不知道最新版本的MySQL是否仍然如此。我找不到有關該主題的任何內容。讓MySQL爲每個表使用多個索引
我試圖優化一個有多個索引的表上的查詢,但EXPLAIN
表明它只使用其中的一個索引。我嘗試使用FORCE INDEX(index1,index2)
,但那是行不通的。有沒有辦法強制MySQL在表中使用多個索引?
我正在使用MySQL 5.6.15。
我記得在某個地方讀取MySQL的每個表只能使用1個索引來查詢SELECT
,但我不知道最新版本的MySQL是否仍然如此。我找不到有關該主題的任何內容。讓MySQL爲每個表使用多個索引
我試圖優化一個有多個索引的表上的查詢,但EXPLAIN
表明它只使用其中的一個索引。我嘗試使用FORCE INDEX(index1,index2)
,但那是行不通的。有沒有辦法強制MySQL在表中使用多個索引?
我正在使用MySQL 5.6.15。
基本上,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僅在非常特殊和罕見的情況下才使用這些優化。
在其他情況下,可以使用組合索引(多列中的單個索引)
您可以顯示查詢和表定義嗎?讀取兩個索引的 – dethtron5000
表示執行兩個查詢,然後合併結果集將比使用一個索引慢。 – Namphibian