我有一個我正在處理的數據庫,有一些查詢顯示在慢查詢日誌中。慢查詢日誌 - 行數超過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萬?
我覺得這一定是查詢拖動這麼多原因的一部分。
感謝一如既往....
我希望你的表不是真的叫做table1和table2!請告訴我,你只是改了名字,讓問題更難閱讀,對吧? – 2012-03-08 07:45:09
可能是因爲它必須遍歷整個表以找到與WHERE條件匹配的表。你可以設置一個'狀態'和'城市'的索引,這可能會加速請求。您也可以嘗試不使用聯接查詢,並在另一個查詢中手動查詢它們。 – FMCorz 2012-03-08 07:54:55
請提供您設置的索引。 – arnep 2012-03-08 08:21:04