プロのヒント SELECT *
は避けてください またはSELECT table.*
パフォーマンスに敏感なクエリで。代わりに、実際に使用する必要のある列を名前で選択してください
プロのヒント MySQLには、GROUP BY
に対する悪名高い非標準の拡張機能があります あなたが使用しているもの、そしておそらく誤用しているもの。これを読む。 https://dev.mysql.com/doc /refman/8.0/en/group-by-handling.html
最初のプロのヒントに従った場合、2番目のヒントに従う方がはるかに簡単です。
プロのヒント クエリを高速化することを期待して、多数の単一列インデックスを「スローイン」することは避けてください。代わりに、実際のクエリのニーズに一致するインデックス(多くの場合、複合インデックス)を作成します。この
プロのヒント Using temporary; using filesort
EXPLAIN出力に表示されることは必ずしも悪いことではありません。これは単に、クエリエンジンが結果セットを返す前に部分的な結果セットをキャッシュする必要があることを意味します。 temporary
物事は実際のテーブルではなく、RAM構造です。それがRAMを圧倒するほど大きい場合、MySQLはそれをディスクにこぼします。しかし、あなたはそうではありません。
そうは言っても、クエリをリファクタリングしましょう。 idCartDATA
が最大の行を取得したいと思います 各CartSplitData.SUPPLIERID
の値 。
それでは、それをサブクエリとして記述しましょう。
SELECT max(IDCartDATA) AS IDCartDATA, SUPPLIERID
FROM CartSplitData
GROUP BY SUPPLIERID
このクエリは、CartSplitDataに複合インデックスを配置することで劇的に高速化できます:(SUPPLIERID, IDCartDATA)
。
次に、メインクエリを書き直して、そのサブクエリのIDに一致する行を見つけましょう。
SELECT CartData.* /* * hammers performance */
CartSplitData.* /* * hammers performance */
FROM CartData
JOIN CartSplitData ON CartSplitData.IDCartDATA = CartDATA.IDCartData
JOIN (
SELECT max(IDCartDATA) AS IDCartDATA, SUPPLIERID
FROM CartSplitData
GROUP BY SUPPLIERID
)x ON x.SUPPLIERID = CartSplitData.SUPPLIERID
AND x.IDCartData = CartSplitData.IDCartData
WHERE CartData.CartOrderref = 'XXXXXXXXX'
CartData.CartOrderref
のインデックス 作成された複合インデックスと同様に、この外部クエリに役立ちます^^^。