首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >选择VARCHAR字段时连接性能非常慢

问选择VARCHAR字段时连接性能非常慢
EN

Stack Overflow用户
提问于 2018-01-31 00:19:11
回答 1查看 1.8K关注 0票数 1

我在查询中遇到了一个困难的问题,我找不出为什么它的表现如此糟糕。

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

代码语言:javascript
复制
SELECT p.TID, a.TID
FROM characters AS p JOIN account a ON p.AccountId = a.TID;

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

解释:

代码语言:javascript
复制
+----+-------------+-------+-------+---------------+--------------+---------+-----------+-------+--------------------------+
| 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)字段,它就会变得非常慢。请看网络时间。

代码语言:javascript
复制
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秒)网络)

代码语言:javascript
复制
+----+-------------+-------+-------+---------------+--------------+---------+-----------+-------+-------------+
| 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的传输引起的,但是可以看到没有联接的查询。

代码语言:javascript
复制
SELECT p.TID, p.LastName
FROM characters AS p

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

代码语言:javascript
复制
+----+-------------+-------+------+---------------+------+---------+------+-------+-------+
| 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测试结果:

​

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-31 02:32:31

我发现了这里的罪魁祸首。在默认设置中,我在InnoDB中使用了MySQL5.1.72。

这意味着它使用的InnoDB缓冲池仅为8MB。

代码语言:javascript
复制
innodb_buffer_pool_size=8M

Mysql被迫将结果写入磁盘,因为当我将VARCHAR字段添加到select子句时,它无法将其保存在内存中进行传输。连接似乎对该缓冲区的内存使用造成了更大压力。

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

代码语言:javascript
复制
innodb_buffer_pool_size=1G

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

​

​

,所以基本上是mysql服务器.的错误配置。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48532588

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档