2012-03-08 10 views
3

我有一個我正在處理的數據庫,有一些查詢顯示在慢查詢日誌中。慢查詢日誌 - 行數超過1000萬,EXPLAIN顯示低於10,000 - 爲什麼這麼高?

有2個表:

表1是標準的企業信息表:姓名,電話,地址,城市,州,郵編等,還有一個字段類別。該表中有數百萬和數百萬行。

table2是一個類別表。只有幾百行。

有問題的查詢低於:

# Query_time: 20.446852 Lock_time: 0.000044 Rows_sent: 20 Rows_examined: 11410654 
use my_database; 
SET timestamp=1331074576; 
SELECT table1.id, name, phone, address, city, state, zip 
FROM table1 
INNER JOIN table2 ON table2.label=table1.category 
WHERE state = 'tx' and city = 'San Antonio' 
and category.label LIKE 'Health Care & Medical%' group by table1.id limit 0,20; 

擴展的EXPLAIN的查詢看起來是這樣的:

id select_type  table type possible_keys key  key_len  ref  rows filtered Extra 
1 SIMPLE table1 index indx_state,indx_city,index_category,cat_keywords PRIMARY  4 NULL 5465 946.92 Using where 
1 SIMPLE table2 ref  category_label category_label 602  my_table.table1.category 1 100.00 Using where; Using index 

這裏的問題:這個查詢花費20秒運行,顯示慢速查詢日誌並永久加載html頁面。

表1中的記錄總數超過1000萬條記錄,但'聖安東尼奧'只有7萬條記錄。匹配查詢的全部記錄(忽略限制)只有幾千個。索引建立在一切之上,EXPLAIN似乎反映了這個事實。

爲什麼檢查的行顯示1100萬?

我覺得這一定是查詢拖動這麼多原因的一部分。

感謝一如既往....

+0

我希望你的表不是真的叫做table1和table2!請告訴我,你只是改了名字,讓問題更難閱讀,對吧? – 2012-03-08 07:45:09

+0

可能是因爲它必須遍歷整個表以找到與WHERE條件匹配的表。你可以設置一個'狀態'和'城市'的索引,這可能會加速請求。您也可以嘗試不使用聯接查詢,並在另一個查詢中手動查詢它們。 – FMCorz 2012-03-08 07:54:55

+0

請提供您設置的索引。 – arnep 2012-03-08 08:21:04

回答

2

我確實按照這個帖子提出了一些建議,並在城市,州創建了一個索引。這對我的表現並沒有什麼幫助,但另一件事結束了。很有可能我發現的修復方法通過在兩列上放置索引也會更有效。然而,

解決的辦法是添加USE INDEX:

http://dev.mysql.com/doc/refman/5.1/en/index-hints.html

通過定義該索引使用,查詢時間從30秒減少到1.5秒。

我不知道它爲什麼起作用,但它確實如此。

+0

我有相同的經歷,只是我使用了FORCE INDEX。 – felipou 2017-09-13 15:18:49

0

好像你需要在狀態城市領域的複合指數。

ALTER TABLE table1 ADD INDEX(city, state); 

我使用城市作爲第一個字段,因爲我認爲它會提供更好的選擇性。你也可以在table1上使用查找表和外鍵,並替換字符串值。性能將受益,並且尺寸將會減少,因爲不會在同一個表中重複使用相同的字符串值。