选择VARCHAR字段时,JOIN性能非常慢

时间:2018-01-31 00:19:11

标签: mysql performance heidisql

我的查询有一个棘手的问题,我无法找出它为什么表现如此糟糕。

请参阅以下查询和查询时间(使用HeidiSQL):

tab1
  

=>行:57.879查询时间:0.063秒。 (+ 0.328秒网络)

说明:

SELECT p.TID, a.TID
FROM characters AS p JOIN account a ON p.AccountId = a.TID;

这很快但是一旦我从表+----+-------------+-------+-------+---------------+--------------+---------+-----------+-------+--------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+-------+---------------+--------------+---------+-----------+-------+--------------------------+ | 1 | SIMPLE | a | index | TID | WebAccountId | 5 | NULL | 21086 | Using index | | 1 | SIMPLE | p | ref | AccountId | AccountId | 5 | dol.a.TID | 1 | Using where; Using index | +----+-------------+-------+-------+---------------+--------------+---------+-----------+-------+--------------------------+ 中选择VARCHAR(255)字段,它就变得非常慢。查看网络时间。

characters
  

=>行:57.879查询时间:0.219秒。 ( + 116.234秒网络

SELECT p.TID, a.TID, p.LastName
FROM characters AS p JOIN account a ON p.AccountId = a.TID;

查询时间仍然不错,但网络时间难以忍受。

有人可能认为它是由+----+-------------+-------+-------+---------------+--------------+---------+-----------+-------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+-------+---------------+--------------+---------+-----------+-------+-------------+ | 1 | SIMPLE | a | index | TID | WebAccountId | 5 | NULL | 21086 | Using index | | 1 | SIMPLE | p | ref | AccountId | AccountId | 5 | dol.a.TID | 1 | Using where | +----+-------------+-------+-------+---------------+--------------+---------+-----------+-------+-------------+ 的转移造成的,但是看到了没有连接的查询

p.LastName
  

=>行:57.881查询时间:0.063秒。 ( + 0.578秒网络

SELECT p.TID, p.LastName
FROM characters AS p

知道这里发生了什么吗?我不知道如何解决这个问题。

修改 为每个查询添加了Explain输出。 如果重要,那就是mysql 5.1.72-community

Edit2:从命令行测试。性能相同。如果我查看mysql进程列表,我会看到+----+-------------+-------+------+---------------+------+---------+------+-------+-------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+------+---------------+------+---------+------+-------+-------+ | 1 | SIMPLE | p | ALL | NULL | NULL | NULL | NULL | 59800 | | +----+-------------+-------+------+---------------+------+---------+------+-------+-------+ 表示执行效果不佳的查询。该查询最初用于ASP.NET Web应用程序之前,性能非常糟糕。这就是我使用HeidiSQL进行调查的原因。我肯定会排除HeidiSQL的问题。

Edit3 在Mysql Workbench中测试结果: Mysql Workbench

1 个答案:

答案 0 :(得分:2)

我发现这里的罪魁祸首是什么。我在默认设置下使用了带有InnoDB的mysql 5.1.72。

这意味着它使用的InnoDB缓冲池只有8MB

innodb_buffer_pool_size=8M

当我将VARCHAR字段添加到select子句时,Mysql被强制将结果写入磁盘,因为它无法将其保留在内存中进行传输。 Join似乎更加压迫了缓冲区的内存使用量。

将缓冲区大小更改为1G后,问题就消失了。

innodb_buffer_pool_size=1G

mysql启动后的第一个请求仍然有点慢,但后续查询速度非常快。

enter image description here

所以基本上错误配置了mysql服务器。