次のクエリは、 'areacode.hours = 2'を追加する場合を除いて、すぐに実行されます。もう1秒かかるのではなく、1分近くかかります。WHEREにJOINを追加すると、MySQLクエリが非常に遅くなります
SELECT lead.id, first, last, lead.phone, valid_phone, mobile_phone
FROM lead
LEFT JOIN dnt ON dnt.phone = lead.phone
LEFT JOIN areacode ON areacode.code = LEFT(lead.phone, 3)
LEFT JOIN campaign ON campaign.id = lead.campaign_id
WHERE dnt.id IS NULL
AND campaign.lft BETWEEN 0 AND 1000
AND lead.datetime BETWEEN '2017-06-01 00:00:00' AND '2017-06-01 23:59:59'
AND areacode.hours = 2
GROUP BY lead.phone
ORDER BY lead.phone DESC
LIMIT 1,1000
結果は、EXPLAIN
1 SIMPLE lead index campaign_id,datetime phone 13 NULL 181181 Using where
1 SIMPLE campaign eq_ref PRIMARY PRIMARY 4 data3_db.lead.campaign_id 1 Using where
1 SIMPLE areacode ref code,hours code 11 func 1 Using index condition; Using where
1 SIMPLE dnt ref phone phone 12 data3_db.lead.phone 1 Using where; Using index; Not exists
1. EXPLAINを使用してインデックスの使用状況を確認する/ 2. areacode.hoursにインデックスを追加する – Jan
クエリで 'EXPLAIN'を実行する必要があります。私の頭の上から、 'areacode.hours'にインデックスを追加するとここで助けになるでしょう。 –
@TimBiegeleisenここで興味があるのは、なぜareacode.hoursにインデックスを追加するのですが、他のフィールドは追加しませんか?私はインデックスを作成するのが初めてです。 –