Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 提高加入性能_Mysql_Sql_Performance_Join - Fatal编程技术网

Mysql 提高加入性能

Mysql 提高加入性能,mysql,sql,performance,join,Mysql,Sql,Performance,Join,此查询运行缓慢: SELECT UserAccountNumber, balance, username FROM users JOIN balances ON users.UserAccountNumber=balances.UserAccountNumber WHERE date < “2011-02-02” 从用户中选择UserAccountNumber、balance、username加入余额 users.UserAccountNumber=余额.UserAccountNumb

此查询运行缓慢:

SELECT UserAccountNumber, balance, username FROM users JOIN balances ON 
users.UserAccountNumber=balances.UserAccountNumber WHERE date < “2011-02-02”
从用户中选择UserAccountNumber、balance、username加入余额
users.UserAccountNumber=余额.UserAccountNumber,其中日期<“2011-02-02”
我可以做些什么来提高它的性能

我考虑使用用户ID而不是userAccountNumber进行连接。 就我所知,连接和其中的users.id=balances.idUser以相同的速度执行

所以。。我还可以改变什么来改进它?
谢谢。

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

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

如果表很大,您可以使用临时表,而不是让MySQL的Optimizer为您排序。不过,这肯定是一种折衷

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`);
创建临时表“tmp\U余额”`
(
`UserAccountNumber`INT,
`balance`INT,
索引(`UserAccountNumber`)
)引擎=内存
选择“UserAccountNumber”,选择“余额”`
来自余额
其中日期<“2011-02-02”;
选择“tmp\U余额”。`UserAccountNumber`,
`tmp_余额`.`余额`,
`用户`.`用户名`
使用(`UserAccountNumber`)从`tmp_balances`内部加入用户;

除此之外(这有点遥不可及),我必须回应前面的评论关于索引的说法。

如果表很大,那么使用临时表可能会有所改进,而不是让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`);
创建临时表“tmp\U余额”`
(
`UserAccountNumber`INT,
`balance`INT,
索引(`UserAccountNumber`)
)引擎=内存
选择“UserAccountNumber”,选择“余额”`
来自余额
其中日期<“2011-02-02”;
选择“tmp\U余额”。`UserAccountNumber`,
`tmp_余额`.`余额`,
`用户`.`用户名`
使用(`UserAccountNumber`)从`tmp_balances`内部加入用户;

除此之外(这有点遥不可及),我必须回应前面的评论者关于索引的说法。

我们需要关于您的模式的更多信息。你在使用索引和外键吗?你有什么标记?如果你在
用户
余额
中都有
用户ID
用户帐号
,那么你还没有完全规范你的设置,这可能会在以后再次困扰你(如果它们不再指向同一
用户
记录会发生什么情况?)。我已将用户帐号编入索引。但是如果有另一个带有UserAccountNumber和ID的表,并且在这里只使用ID进行连接,不是更快吗?谢谢。列“日期”在哪个表中?我们需要有关您的架构的更多信息。你在使用索引和外键吗?你有什么标记?如果你在
用户
余额
中都有
用户ID
用户帐号
,那么你还没有完全规范你的设置,这可能会在以后再次困扰你(如果它们不再指向同一
用户
记录会发生什么情况?)。我已将用户帐号编入索引。但是如果有另一个带有UserAccountNumber和ID的表,并且在这里只使用ID进行连接,不是更快吗?谢谢。哪一个表是“日期”列?好的,所以我还必须为“日期”列编制索引。和使用并UNIXDATE将日期字段保存为INT如何?这不是比比较日期字段快吗?日期可能已经在内部存储为整数,所以我怀疑这会有什么不同。好的,所以我还必须为日期列编制索引。和使用并UNIXDATE将日期字段保存为INT如何?这不是比比较日期字段快吗?日期可能已经在内部存储为整数,所以我怀疑这会有什么不同。