2017-03-01 165 views
0

我有簡單的MySQL查詢,其運行速度非常慢。優化Mysql查詢,

INSERT INTO People_by_County (City, County, State, score, Month_, person_id) 
SELECT people.City, people.County, people.State, PPL_month.score, PPL_month.Month_, PPL_month.person_id 
FROM PPL_month 
INNER JOIN people ON PPL_month.person_id = people.person_id 

人表中的700K行和PPL_month表中的2,9Mln行。問題是,在我對不同的表執行類似查詢之前,在一個表上,另一個400Mln上有700K行,查詢在6小時內完成。而且這個運行了將近24小時。任何想法爲什麼這麼慢?當時沒有其他查詢正在運行,因此沒有人正在使用RAM。

波紋你可以看到查詢的解釋。

enter image description here

+0

「people」表中'person_id'列是否有索引? –

+0

你能否提供有關表格結構的信息?你有索引嗎?你是否使用MySQL EXPLAIN函數試圖瞭解查詢的內容? –

+0

發佈結構,索引,並運行它與解釋(只是選擇部分)併發布結果 –

回答

1

首先創建INDEXPERSON表以及PPL_Month table.Then嘗試執行此查詢

SELECT people.City, people.County, people.State, PPL_month.score, PPL_month.Month_, PPL_month.person_id 
FROM PPL_month 
INNER JOIN people ON PPL_month.person_id = people.person_id 

多少時間了執行?記下時間,並記下執行對同一個查詢進行計時而不在兩個表上創建索引。 你一定會得到更多的時間。 所以間接表示要插入的數據更多地取決於它被提取的速度。因此,一旦抓取速度很快,插入速度比前一次更快。

希望這會有所幫助。

+0

它像一個魅力工作。謝謝。但是,你能幫我理解這個過程嗎?我認爲,爲了索引,你必須只有唯一的值,我在People表中有,但不是在PPL_month(有多個相同的person_id)。索引如何在此表上工作?它忽略了所有其他相同的值嗎? – Extria

+0

@Extria如果您沒有特定表的唯一值,那麼您可以使用組合兩列或更多列來實現唯一性,這完全取決於您的執行計劃。因此,建議始終使用Explain來檢查您的查詢執行情況,然後只能繼續在多列的組合上創建索引。 Syntex同樣是 '在表名(column1,column2)上創建索引idx;'。 有關進一步的說明或討論,請查看:http://mysql.rjweb.org/doc.php/index_cookbook_mysql –