好的,首先,我知道人们会说“取决于数据,服务器硬件等......”
我正在建立一个客户端连接并向我发送数据的系统。处理完这些数据,然后将大量行插入MySQL。同时,用户可以使用我们的web-ui对数据运行查询。有时查询太慢而无法返回结果(100 - 200秒)。我知道可能有一些索引优化和我们可以做的其他事情,但我相信问题的一部分是所有插入和用户提交的选择查询之间的竞争。
在这种情况下是否存在用于提高性能的通用基础架构架构/设计?例如,我考虑过有两个mysql实例,其中master接收所有插入并且slave处理查询,但是这会受到锁和争用的影响,或者这与拥有单个mysql实例大致相同?我不是数据库和大型数据集方面的专家,因此您可以提供的任何资源都非常有用。我有高性能MySQL书籍,但我希望从社区中获得一些见解。
16 GB RAM,8个CPU,ubuntu,目前大约10 GB的数据,但增长相当快。使用innodb但很可能很快就会开始使用Percona Server,看它是否能改善它。
答案 0 :(得分:2)
缓存插入内存表
如果您可以使用它,您可以先将客户端插入单独的MEMORY
表中,然后使用INSERT DELAYED
批量更新这些表。
这会加快您的插入速度,因为:
INSERT DELAYED
,您可以优先选择SELECTS而不是INSERTS。INSERT
的时间(也许是晚上?)你可以为UPDATES做同样的事情。
默认情况下,MySQL针对小内存和小表进行了调整
确保查看您的设置以利用所有RAM。在默认设置中,MySQL只使用一小部分RAM。
SELECT和INSERT正在一个线程上运行
单个SELECT
或INSERT
只能使用一个帖子
使用8个CPU,每个4个核心,您可以同时运行至少32个线程,而不会出现任何CPU瓶颈。
如果几乎没有选择运行,那么在主从设置中的单台机器上安装2个MySQL实例(在不同的端口上)可能是值得的。
这不是通常的用例,因为通常会有许多选择/插入同时运行。测试是否所有核心都在运行。
选择时间并使用说明
要查看MySQL是否正如您想象的那样使用正确的索引。
让您的主要索引尽可能短
MySQL的InnoDB包含主键作为每个二级索引的覆盖索引,因此请确保您的PK很短。 INTEGER通常是一个不错的选择。
<强>链接:强>
INSERT DELAYED:http://dev.mysql.com/doc/refman/5.5/en/insert-delayed.html
配置调整:http://mysqldatabaseadministration.blogspot.com/2005/11/mysql-5-optimization-and-tuning-guide.html
配置调优2:http://www.mysqlperformanceblog.com/2006/09/29/what-to-tune-in-mysql-server-after-installation/
解答:http://dev.mysql.com/doc/refman/5.5/en/explain.html
答案 1 :(得分:1)
我通常通过主/从数据库架构设置来完成此操作。主数据库处理实际的插入和基本选择,而从属数据库是实际发生的分析跟踪。
编辑:
是什么让奴隶更快(其他 可能比不同的运行 硬件)?是因为更新 来自大师 - &gt;奴隶更喜欢 批量更新而不是大量更新 插入陈述?
这取决于你如何设置它。它既可以执行从binlog中检索的语句,也可以只添加更改的行。您希望使用哪些内容取决于通常在特定时间范围内完成的插入数量。我建议查看MySQL复制如何在幕后工作:
http://dev.mysql.com/doc/refman/5.1/en/replication-implementation.html
您的主人与奴隶同步多久一次?
不幸的是,这个设置是在以前的工作,我没有足够的权限知道这些信息,所以我没有答案。
答案 2 :(得分:0)
使用InnoDB是一个很好的第一步:当插入发生时,它会阻止表锁定。