mysql在各个字段中搜索或执行全表扫描

时间:2013-02-13 06:36:20

标签: mysql full-table-scan

我有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行?

1 个答案:

答案 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%')