2

このクエリの実行速度は遅くなります。

SELECT UserAccountNumber, balance, username FROM users JOIN balances ON 
users.UserAccountNumber=balances.UserAccountNumber WHERE date < “2011-02-02”

パフォーマンスを向上させるために何ができますか?

userAccountNumberの代わりに、参加にユーザーIDを使用することを考えました。私の知る限り、Appartはそれを形成します。JOINとWHERE users.id=balances.idUserは同じ速度で実行します。

だから..それを改善するために他に何を変えることができますか?ありがとう。

4

2 に答える 2

4

クエリ自体は私には問題ないように見えますが、UserAccountNumber列(結合に関係しているため)とdate(検索している列)にインデックスがあることを確認してください。データベースが多数のレコードの順次スキャンを実行する必要がある場合、それは遅くなります。を使用EXPLAIN SELECTすると、データベースが実際にクエリを実行している方法を理解するのに役立つ場合があります。

于 2012-06-13T23:00:08.577 に答える
0

テーブルが巨大な場合は、MySQLのオプティマイザーに分類させるのではなく、一時テーブルを使用して改善できる可能性があります。ただし、それは確かにトレードオフになります。

CREATE TEMPORARY TABLE `tmp_balances`
(
  `UserAccountNumber` INT,
  `balance` INT,
  INDEX (`UserAccountNumber`)
) ENGINE=MEMORY
SELECT `UserAccountNumber`, `balance`
FROM balances
WHERE date < "2011-02-02";

SELECT `tmp_balances`.`UserAccountNumber`, 
    `tmp_balances`.`balance`, 
    `users`.`username`
FROM `tmp_balances` INNER JOIN users USING (`UserAccountNumber`);

それ以外の場合(そしてそれは少し長い目で見ます)、私は以前のコメンテーターが索引付けについて言ったことをエコーする必要があります。

于 2012-06-13T23:25:26.200 に答える