我有3个表(不写所有和实际的字段名称)
合同(约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
但是当我开始使用OR
从客户端添加电话号码时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 :(得分:-1)
使用而不是在哪里。
SELECT * FROM contract JOIN client ON contract.client_id = client.id 加入容器 ON contract.contract_nr = container.contract_nr AND(container.phone_1 LIKE'264%'client.phone_2 LIKE'264%'或client_phone_3 LIKE'264%')