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