0

私は3つのテーブルを持っています(すべてと実際のフィールド名を書いているわけではありません)

  • 契約(〜30000行)

    | id | client_id | Contract_nr|...。

  • コンテナ(〜30000行

    | id | Contract_nr | phone_1(varchar)|...。

  • クライアント(〜35 000行)

    | id | phone_2(varchar)| phone_3(varchar)| phone_4(varchar)|...。

電話番号を検索する必要があるので、これを試してみます。たとえば、container.phone_1で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%'
)

説明の拡張:

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行のスキャンを回避するにはどうすればよいですか?

4

1 に答える 1