3

次のようなクエリがある場合

SELECT (MAX(b.A)/a.A) AS c
FROM a
INNER JOIN b
ON a.b_id = b.id
GROUP by a.id

MySQLは、すべての行に対して「MAX(bA)」の値を評価しますか、それとも1回だけ評価しますか?

パフォーマンスを改善する余地があるかどうかは、私にとって興味深いことです。

ありがとう!

アップデート

OK、実際の例に移りましょう。max-user-likesと比較したuserslikesの比例値を計算したいと思います。

users.likes(インデックス付けされている)の最大値のみを読み取るクエリは0.0003を取ります

SELECT MAX(likes) 
FROM users

これで、max-user-likesの値がわかりました。たとえば、10000であるとすると、0.0007秒かかる次のようにクエリできます。

SELECT (users.likes/10000) AS weight 
FROM posts
INNER JOIN users ON posts.author_id = users.id 

したがって、両方のクエリを一緒にすると0.0003 + 0.0007秒のようになると予想されますが、0.3秒かかります。

SELECT (users.likes/(SELECT MAX(likes) FROM users)) AS weight 
FROM posts
INNER JOIN users ON posts.author_id = users.id 

それで、私のデータベースにまだ何か問題があるようです-何か提案はありますか?

4

2 に答える 2

3

句がないためGROUP BY、結果には1行しかなく、どの行からの値になるかわかりませんa.A。の値はMAX(b.A)1回だけ評価されます。

GROUP BY句がある場合、はすべてのグループMAX(b.A)に対して評価されます。

于 2013-03-07T08:58:38.070 に答える
1

一般に、集計関数内の式が評価され、各行のNULLがチェックされます。インデックスをウォークスルーする場合の最適化は確かにあり得ますがMIN、私はそれを疑っています。MAX

MAX(id)ところで、大きなテーブルで実行すると、これを簡単に確認できます。実行時間はと同じであることがわかりますCOUNT(id)(エンジンによってははるかに長い場合がありますCOUNT(*))。

于 2013-03-07T10:21:50.820 に答える