2013-04-09 40 views
4

我有一個查詢,拉形式很多表,但它很慢,我想改善它。什麼是我的查詢獲得快速結果的好索引?

SELECT 
    ph.phone_call_id AS id, 
    ph.call_subject AS callSubject, 
    ac.account_name AS accountName, 
    ph.trigger_on AS triggerOn, 
    ph.isAppointment, 
    ph.status, 
    ind.name AS industry, 
    cc.call_code_name AS callCode, 
    ac.account_id FROM phone_calls AS ph 
INNER JOIN accounts AS ac ON ph.account_id = ac.account_id 
INNER JOIN industries AS ind ON ind.industry_id = ac.industry_id 
INNER JOIN call_codes AS cc ON ph.call_code_id = cc.call_code_id 
WHERE 
    ac.status = 1 AND 
    ph.status = 1 AND 
    ph.owner_id = 1 AND 
    ac.do_not_call = 0 AND 
    ph.trigger_on BETWEEN '2012-10-09 00:00:00' AND '2013-04-09 23:59:59' 
LIMIT 0,25 

請注意,phone_Calls表有大約450萬條記錄和大約300k條記錄的帳戶。

我有這樣的指數目前

ph.trigger_on 
ph.owner_id 
ph.status 


ac.status 
ac.do_not_call 
ac.account_id 

這裏是我所得到的,當我解釋查詢

enter image description here

回答

1

重要的是要記住,使一列質量指標是很重要一個具有高度的獨特性。我不確定您的系統中有多少個status值,但如果您的表格只有3種可能的狀態,那麼它不是一個好的索引。

將您的索引放在您正在執行的連接操作的中心位置的列上也是有幫助的。在這種情況下,ph.account_id,ac.account_id,ind.industry_id,ac.industry_id,ph.call_code_id,ph.owner_idcc.call_code_id都看起來像很好的索引候選(如果它們不是索引的話)。請注意,如果您的任何表有很多索引(超過五個小時),這可能會降低您的查詢速度。此外,如果涉及的任何表有大量的寫入或刪除操作(與讀取次數相當),那麼將這些表重新編入索引是不明智的,因爲每個索引文件在具有許多寫操作在他們身上執行。我的經驗是,索引是一門藝術,而不是科學,所以你必須做一些實驗來找出最適合你的系統。如果可能,請嘗試離線觀看給定數據集的最佳提升。祝你好運。

+0

感謝您的信息。狀態是0,1,2然而我幾乎總是在我的where子句中使用它。是的,我有很多索引,這就是爲什麼我要求幫助,因爲我不認爲我正在做索引部分。所以對於上面的查詢什麼是一個好的索引?如果我添加ph.account_id,ph.call_code_id和ph.owner_id這3個索引就在那裏,所以我不知道什麼是管理這些索引的最佳方法 – Mike 2013-04-09 22:59:08

+0

我對你的數據集不熟悉,所以我不能確定。選擇非常獨特的列幾乎總是一個很好的選擇。這聽起來像你必須以編程方式應用每個新的索引,然後運行你的解釋說明。這將揭示哪些將最有幫助。每個人都應該至少幫助一下,但是你想選擇那些最相關的人。在你的連接語法中引用的那些似乎是最好的選擇。 – usumoio 2013-04-09 23:06:07

+1

我如何可編程地應用每個索引? – Mike 2013-04-09 23:13:01

0

與其他人一樣,如果您的INDEX列都是0和1位,那麼您不需要索引就可以了,並且id自動增量應該對主索引更好。我猜phone_call_id是INT並且是唯一的?這是一個自動增量字段嗎?

MySQL在內部使用自動遞增id索引,因此對於這樣的表,最好擁有它。

如果您使用SHOW CREATE TABLE帳戶發佈您的架構結構; SHOW CREATE TABLE phone_calls;等我們可以幫助你更多。

我會把數據庫 - 因爲它只有300k - 並在本地加載它,然後添加自動增量列,如果它不是phone_call_id,則刪除所有其他索引除了phone_call_id,account_id,industry_id和call_code_id。

爲了幫助您更多,我需要知道那些其他表的結構是什麼,特別是有多寬和多少行。

相關問題