400k レコードを含むInnoDbitem
テーブルにクエリがあります (のみ...)。プレゼンテーション レイヤー (1 ページあたり 60) の結果をページングする必要があるため、LIMIT
表示するページに応じて値を使用します。
クエリは次のとおりです (110000
オフセットは単なる例です)。
SELECT i.id, sale_type, property_type, title, property_name, latitude,
longitude,street_number, street_name, post_code,picture, url,
score, dw_id, post_date
FROM item i WHERE picture IS NOT NULL AND picture != ''
AND sale_type = 0
ORDER BY score DESC LIMIT 110000, 60;
私のマシンでこのクエリを実行すると、約 1 秒かかります。テスト サーバーでこのクエリを実行すると、45 ~ 50 秒かかります。
EXPLAIN はどちらも同じです:
+----+-------------+-------+-------+---------------+-----------+---------+------+--------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+---------------+-----------+---------+------+--------+-------------+
| 1 | SIMPLE | i | index | NULL | IDX_SCORE | 5 | NULL | 110060 | Using where |
+----+-------------+-------+-------+---------------+-----------+---------+------+--------+-------------+
クエリ時の構成の唯一の違いは次のshow variables
とおりです。
innodb_use_native_aio
. 私のマシンではなく、テストサーバーで有効になっています。無効にしてみましたが、大きな変化は見られませんinnodb_buffer_pool_size
テストサーバーで1G、私のマシンで2G
テスト サーバーには 2Gb の RAM、2 コア CPU があります。
- mysqld は常に RAM の 65% を超えて使用しますが、クエリを超えると 1 ~ 2% しか増加しません
- mysqld は、上記のクエリの実行中に CPU の 14% を使用し、アイドル状態のときは使用しません
私のローカル マシンには 8Gb、8 コアの CPU があります。
- mysqld は常に RAM の 28% を使用し、上記のクエリを実行している間 (または私が確認できる非常に短い時間)、実際には増加しません。
- mysqld は、上記のクエリの実行中に CPU の 48% を使用し、アイドル状態のときは使用しません
テスト サーバーで同じパフォーマンスを得るには、どこで何をすればよいですか? RAM や CPU が少なすぎませんか?
アップデート
同じ仕様の新しいテスト サーバーをセットアップしましたが、8G の RAM と 4 コアの CPU を使用すると、パフォーマンスが私のマシンと同様の値に跳ね上がりました。元のサーバーはすべての RAM/CPU を使用していないように見えましたが、パフォーマンスがこれほど悪いのはなぜですか?