2013-02-13 77 views
0

我有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行的容器表?

+0

連接將會終止大數據集中的查詢性能。如果可能,請考慮避免它們,或者如果您需要按比例處理數據,則重構您的數據。 – Tucker 2013-02-13 06:38:49

+0

當我在查詢中添加「OR」時,問題就開始了 - 連接沒有問題!用table1.field替換連接= table2.field - 沒有區別 - 仍然執行fullscan! – 2013-02-13 07:14:04

+0

數據集大小不重要恕我直言。如果你做一個'EXPLAIN SELECT * ...',你將得到一個執行計劃。請張貼結果,因爲這對查詢性能問題有很大的幫助。 – Raad 2013-02-13 09:48:26

回答

-1

使用而不是在哪裏。

SELECT * FROM合同JOIN客戶ON contract.client_id = client.id JOIN容器 ON contract.contract_nr = container.contract_nr AND(container.phone_1 LIKE '264%' client.phone_2 LIKE '264%' OR client_phone_3 LIKE'264%')

+0

這不是有效的SQL - 你必須擁有一個WHERE子句來應用一個條件,除非你正在聚合。 – Raad 2013-02-13 09:39:52