3

MySQL クエリの最適化に問題がありますが、これまでのところ、500 レコードに制限された単純な結果を取得するには時間がかかりすぎます。

私のクエリはこれです:

SELECT ou.*, gr.accepted, gr.value 
FROM offer_usermeta ou 
LEFT JOIN gateway_requests AS gr ON ou.customer_id = gr.customer_id 
WHERE ou.customer_id != "" 
AND ou.created >= '2012-10-08 00:00:00' 
AND ou.created <= '2012-10-08 23:59:59' 
ORDER BY ou.created DESC LIMIT 500

このクエリは、おそらく 40,000 レコードを反復処理するのに丸 1 分かかります。顧客 ID に基づいてゲートウェイの応答を取得する必要があり、このクエリでデータが正しいように見えますが、最適化のヒントが必要です。データを個別に取得し、必要に応じて一緒に foreach することを検討していましたが、おそらくはるかに遅くなるでしょう...

任意のヒント?(誰かがそこに派手なトリックを知っているなら、私は codeigniter を使用しています)

4

2 に答える 2

2

createdまだ行っていない場合は、列にインデックスを追加します。500 レコードしかない 場合でも、DB はすべてのレコードをフェッチしorder byて条件に一致させる必要があります。その後試してみるwherelimit

SELECT ou.*, gr.accepted, gr.value 
FROM offer_usermeta ou 
LEFT JOIN gateway_requests AS gr ON ou.customer_id = gr.customer_id 
WHERE ou.created between '2012-10-08 00:00:00' and '2012-10-08 23:59:59' 
ORDER BY ou.created DESC 
LIMIT 500
于 2012-10-15T19:10:46.480 に答える
0

より効率的な between ステートメントを実行できるはずです。

AND ou.created between '2012-10-08 00:00:00' AND '2012-10-08 23:59:59'

于 2012-10-15T19:11:39.600 に答える