2

此查询运行缓慢:

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

我能做些什么来提高它的性能?

我考虑过使用用户 ID 来代替 userAccountNumber。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 回答