我有3個表(不寫都和實際字段名)MySQL的搜索與或執行全表掃描
合同(〜30個000行)
| ID | CLIENT_ID | contract_nr | ....
容器(〜30個000行
| ID | contract_nr | PHONE_1(VARCHAR)| ....
客戶端(35〜000行)
| ID | phone_2(VARCHAR)| phone_3(VARCHAR)| phone_4(VARCHAR)| ....
我需要搜索電話號碼所以我嘗試這一點 - 如果我在container.phone_1
SELECT *
FROM contract JOIN client
ON contract.client_id = client.id
JOIN container
ON contract.contract_nr = container.contract_nr
WHERE container.phone_1 LIKE '264%'
id select_type table type possible_keys key key_len ref rows filtered Extra
-------------------------------------------------------------------------------------------------------------
1 SIMPLE container range contract_nr,phone_1 phone_1 63 NULL 912 100.00 Using where
1 SIMPLE contract ref contract_nr,client_id contract_nr 26 container.contract_nr 1 100.00
1 SIMPLE client eq_ref PRIMARY,id PRIMARY 3 contract.client_id 1 100.00
SERCH一個電話號碼,例如但是當我開始從客戶端添加電話號碼使用或
SELECT *
FROM contract JOIN client
ON contract.client_id = client.id
JOIN container ON contract.contract_nr = container.contract_nr
WHERE (
container.phone_1 LIKE '264%' OR
client.phone_2 LIKE '264%' OR
client_phone_3 LIKE '264%'
)
EXPLAIN EXTENDED:
id select_type table type possible_keys key key_len ref rows filtered Extra
-------------------------------------------------------------------------------------------------------------
1 SIMPLE container ALL k_ligums,k_telef NULL NULL NULL 32113 100.00
1 SIMPLE contract ref contract_nr,client_id contract_nr 26 za.zaao_konteineri.k_ligums 1 100.00
1 SIMPLE client eq_ref PRIMARY,id PRIMARY 3 contract.client_id 1 100.00 Using where
我已經索引了用於連接表和用於搜索的所有字段。 我也嘗試爲包含所有搜索行的客戶端和容器表創建多列索引 - 沒有區別。
我該如何避免掃描32113行的容器表?
連接將會終止大數據集中的查詢性能。如果可能,請考慮避免它們,或者如果您需要按比例處理數據,則重構您的數據。 – Tucker 2013-02-13 06:38:49
當我在查詢中添加「OR」時,問題就開始了 - 連接沒有問題!用table1.field替換連接= table2.field - 沒有區別 - 仍然執行fullscan! – 2013-02-13 07:14:04
數據集大小不重要恕我直言。如果你做一個'EXPLAIN SELECT * ...',你將得到一個執行計劃。請張貼結果,因爲這對查詢性能問題有很大的幫助。 – Raad 2013-02-13 09:48:26