我在查询中遇到了一个困难的问题,我找不出为什么它的表现如此糟糕。
请参见以下查询和查询时间(使用HeidiSQL):
SELECT p.TID, a.TID
FROM characters AS p JOIN account a ON p.AccountId = a.TID;=>行: 57.879次查询时间: 0.063秒。(+ 0.328秒)(网络)
解释:
+----+-------------+-------+-------+---------------+--------------+---------+-----------+-------+--------------------------+
| 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 |
+----+-------------+-------+-------+---------------+--------------+---------+-----------+-------+--------------------------+这是很快的,但只要我从表characters中选择一个VARCHAR(255)字段,它就会变得非常慢。请看网络时间。
SELECT p.TID, a.TID, p.LastName
FROM characters AS p JOIN account a ON p.AccountId = a.TID;=>行: 57.879次查询时间: 0.219秒。(+ 116.234秒)网络)
+----+-------------+-------+-------+---------------+--------------+---------+-----------+-------+-------------+
| 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的传输引起的,但是可以看到没有联接的查询。
SELECT p.TID, p.LastName
FROM characters AS p=>行: 57.881次查询时间: 0.063秒。(+ 0.578秒)网络)
+----+-------------+-------+------+---------------+------+---------+------+-------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+-------+-------+
| 1 | SIMPLE | p | ALL | NULL | NULL | NULL | NULL | 59800 | |
+----+-------------+-------+------+---------------+------+---------+------+-------+-------+知道这是怎么回事吗?我不知道怎么解决这个问题。
编辑:为每个查询添加了解释输出。如果重要的话,它是MySQL5.1.72-社区
Edit2:从命令行测试。同样的表演。如果我查看mysql进程列表,就会看到Sending data用于执行不佳的查询。该查询最初是在ASP.NET web应用程序中使用的,性能非常差。这就是为什么我使用HeidiSQL进行调查的原因。我肯定会排除HeidiSQL的问题。
Mysql中的Edit3测试结果:

发布于 2018-01-31 02:32:31
我发现了这里的罪魁祸首。在默认设置中,我在InnoDB中使用了MySQL5.1.72。
这意味着它使用的InnoDB缓冲池仅为8MB。
innodb_buffer_pool_size=8MMysql被迫将结果写入磁盘,因为当我将VARCHAR字段添加到select子句时,它无法将其保存在内存中进行传输。连接似乎对该缓冲区的内存使用造成了更大压力。
当我将缓冲区大小更改为1G后,问题就消失了。
innodb_buffer_pool_size=1Gmysql启动后的第一个请求可能仍然有点慢,但是后续的查询非常快。

,所以基本上是mysql服务器.的错误配置。
https://stackoverflow.com/questions/48532588
复制相似问题