【问题标题】:Improve a Join performance提高连接性能
【发布时间】:2012-06-16 23:28:57
【问题描述】:

此查询运行缓慢:

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

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

我考虑过使用用户 ID 而不是 userAccountNumber 来加入。 Appart form 它,据我所知,JOIN 和 WHERE users.id = balances.idUser 以相同的速度执行......

那么..我还能改变什么来改进它? 谢谢。

【问题讨论】:

  • 我们需要有关您的架构的更多信息。你在使用索引和外键吗?
  • 你有什么指标?如果您在users 和balances 中同时拥有userId 和userAccountNumber,那么您的设置还没有完全标准化,这可能稍后会反过来咬你(如果他们不再指向相同的user 记录?)。
  • 我已将 UserAccountNumber 编入索引。但。拥有另一个带有 UserAccountNumber 和 ID 的表并在这里只使用 ID 进行 JOIN 会不会更快?谢谢。
  • “日期”列在哪个表?

标签: mysql sql performance join


【解决方案1】:

查询本身对我来说看起来不错,但请确保您在 UserAccountNumber 列(因为它们参与连接)和 date(您正在搜索的列)上有索引。如果数据库必须对大量记录进行顺序扫描,那会很慢。使用EXPLAIN SELECT 可以帮助您了解数据库实际上是如何执行查询的。

【讨论】:

  • 好的,所以我还必须索引日期列。并且...使用和 UNIXDATE 将 DATE 字段保存为 INT 怎么样?不是比比较 DATE 字段更快吗?
  • 日期可能已经在内部存储为整数,所以我怀疑它会有所作为。
【解决方案2】:

如果表很大,您可能会使用临时表获得一些改进,而不是让 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`);

除此之外(这有点远),我不得不回应之前评论者所说的关于索引的内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多