以下は、完了までに約 1 ミリ秒かかる mysql クエリです。
SELECT SQL_NO_CACHE DISTINCT invoice.*,
GROUP_CONCAT(DISTINCT line.guid) as line
FROM invoice
LEFT JOIN ligne ON line.invoice = invoice.guid
GROUP BY invoice.guid
WHERE acompte = 1
LIMIT 0, 100;
クエリに追加ORDER BY invoice.date
すると、非常に遅くなり、完了するまでに約 3 秒かかります。
LEFT JOIN
(および)を削除するとGROUP_CONCAT
、クエリは再び 1 ミリ秒かかります。
EXPLAIN
クエリが遅いときにMySQLが何をしているのかを確認するために追加しました。一時ファイルを使用していることがわかります。
1 SIMPLE invoice index NULL PRIMARY 4 NULL 25385 Using temporary; Using filesort
1 SIMPLE line ref invoice invoice 5 gestixi.invoice.guid 1 Using index
そのクエリを高速化する方法があると確信していますが、見つかりません。何か案が ?
date
ユーザーがテーブルの各フィールドをソートできるようにするため、インデックスを追加できないことに注意してください(ちなみに、何も変更しません)。
invoice.guid
また、 、line.invoice
、line.guid
およびacompte
にはインデックスが付けられていることに注意してください。
編集
LEFT JOIN を使用せずに ORDER BY 句を使用して最初のクエリを実行し、必要な行の ID を取得してから、WHERE 句でこれらの ID を使用して 2 番目のクエリ (上記のような) を実行すると、取得できるものを取得できます。 10ms未満で必要です。
これは、インデックスを追加せずにそのクエリを高速化する方法であるに違いないと私は信じています。