MYSQL数据库服务器优化:当连接数众多时,查询速度非常缓慢。

4
我正在运行一个MySQL DB服务器。在进行负载测试时,当有数千个连接时,MySQL查询需要花费几分钟的时间。我该如何优化这种情况?
以下是我的mysql db配置的简要描述:
1. 只有对表的读取访问。 2. 使用Innodb引擎。 3. 运行了mysqltuner,并实施了其推荐的内容。 4. 系统正在处理大量查询,可能还有一半以上的连接处于打开状态。 5. 已经进行了文件系统优化。
我意识到这是一个非常广泛的问题,但希望得到任何意见。
编辑:添加更多信息:
查询非常简单,例如“select * from q6 where created_at='2013-10-02+00:00:00'”。查询将始终采用这种形式。表的模式类似于(其中一个六个巨大的表):
create table q4t_table ( created_at TIMESTAMP, tweet TEXT) engine=InnoDB;
这些表基于时间戳(或某些表中的int类型的用户ID)索引。同时只会访问其中一个表。
表的大小通常为300Mb或3Gb或8Gb。

你的问题中缺乏足够的信息来帮助确定潜在的优化方案。哪些查询运行时间较长?为什么会这样?你的查询是否因某种原因处于等待状态?你是否达到了最大连接限制?对于慢查询,你是否有适当的索引?对于索引,你是否有适当的内存分配?服务器大小是否适合处理你的负载? - Mike Brant
@MikeBrant 我给这个问题添加了更多信息。我不知道如何获取有关查询状态的信息。但是,当服务器正在测试时,我尝试访问我的数据库。在表上进行简单的计数需要超过2分钟。如何更改索引的内存分配?我认为我可能也会遇到最大连接数的限制。 - Himz
你提供的那个 CREATE TABLE 的例子,是完整的表结构吗?如果是的话,那么该表上没有索引,这显然会导致非优化查询,在大表上可能需要很长时间才能运行。看起来你需要了解一下 MySQL 中正确的索引使用方法。 - Mike Brant
我后来对表进行了索引。所以该表已被索引。 - Himz
在你的问题中展示show processlist命令的输出可能会有所帮助,特别是在你发现查询性能不佳的时间点。你还应该添加与processlist中显示长时间运行的查询相关的表定义。 - Mike Brant
如果你想让我们帮助优化一个查询,你需要向我们展示表和索引的定义,以及每个表的行数。也许你的表定义不合理。也许索引没有正确创建。也许你认为某一列有索引,但实际上并没有。如果没有看到表和索引的定义,我们无法判断。我们还需要知道行数,因为这会极大地影响查询优化。如果你知道如何使用EXPLAIN或获取执行计划,请将结果放在问题中。如果你没有索引,请尽快访问http://use-the-index-luke.com。 - Andy Lester
1个回答

2

您可能因为打开太多的连接而耗尽了内存。您应该使用连接池,如sqlRelay或内置在您的语言平台中的连接池机制。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接