我有一张能容纳大气泡(高达10米)的桌子,并且经常更新。问题是UPDATE语句可能需要1秒才能执行,而且由于应用程序的设计,这会阻塞UI。我需要加快更新/插入语句的速度。有什么方法可以通过调优MySQL服务器/存储引擎/etc来实现呢?
所讨论的表是InnoDB,我尝试过对压缩进行调优,但这似乎并没有多大的区别。客户端与服务器位于同一台机器上,因此不存在网络开销。服务器为MySQL 5.5
发布于 2013-07-18 17:49:52
BLOB数据在哪里会成为InnoDB的瓶颈?三地
如果正在编写许多更新BLOB数据的事务,那么InnoDB日志文件(由诺姆b设置)的大小可能是一个瓶颈。
如果InnoDB日志缓冲区设置得比BLOB本身小,那么它(由诺姆b设置)可能会成为一个严重的瓶颈。缺省值为800万。您可能需要调整它的大小,以容纳多个具有该气泡的行。或许1.28亿美元将是一个很好的起点。这也可以减少写入InnoDB日志文件时的磁盘I/O。
什么是MySQL包?
根据书
第99页第1至3段对此作了如下解释:
MySQL网络通信代码是在假定查询总是相当短的前提下编写的,因此可以将查询发送到服务器,并由服务器在一个块中进行处理,这在MySQL术语中称为数据包。服务器为一个临时缓冲区分配内存以存储数据包,并且它的请求足够满足它的需要。这种架构需要一种预防措施,以避免服务器耗尽内存--限制数据包的大小,这个选项实现了这一点。有关此选项的相关代码可在sql/net_serv.cc中找到。看看my_net_read(),然后按照对my_real_read()的调用,特别注意net_realloc()。这个变量还限制了许多字符串函子的结果的长度。有关详细信息,请参阅sql/field.cc d.cc和sql/intem_STFIC.cc。
无论何时有MySQL数据的传输,MySQL分组将MySQL数据传输到操作系统和网络中。与InnoDB日志缓冲区一样,MySQL数据包也必须容纳多个BLOB。
我过去曾讨论过这个话题。
Nov 22, 2011
:使用12524字符blob对重复UPDATE语句执行插入的MySQL查询“离开”Aug 01, 2011
:马克斯_允许的_数据包会影响数据库的备份和恢复吗?Apr 27, 2011
:变最大_允许的_仍在接收“数据包太大”的错误压缩可能会使事情变得更糟。为什么?
压缩InnoDB表时,每当读取该表的数据和索引页时,该页和未压缩的页面副本在InnoDB缓冲池中共存。如果要使表压缩,则必须展开(innodb缓冲池(由innodb设置)。我写了这篇文章,还更新了我的一个旧答案:诺姆b_文件_船型梭鱼
基于你上次的评论
初步印象:虽然调优InnoDB缓冲区有点帮助,但似乎更多的改进来自于关闭这个特定表的二进制日志。还在监视演出..。
我有个建议
您可能需要重新架构您的InnoDB文件,以便所有.ibd
文件都在数据卷上,而其他MySQL组件(ibdata1、ib_logfile0、ib_logfile1、所有二进制日志)可以挂载到另一个磁盘上。我之前在一篇关于PostgreSQL:英特尔S3700在SSD上的写性能的文章中提到过这个问题,问这个问题的人说他的表现提高了10%。
因为我问
问题: 1)数据库服务器上有多少RAM ? 2)显示变量如‘innodb_file_per_table’的结果如何;3)运行
SELECT SUM(data_length+index_length) FROM information_schema.tables WHERE engine='InnoDB';
时得到了什么?
你说过
8gb内存,4gb可供MySQL使用。‘'innodb_file_per_table','ON’。之和是3316736000
我建议如下(如果您还没有这样做)
试试看!!
发布于 2013-07-18 12:42:44
1)对于有几个列的表,为了减少对不使用BLOB列的查询的内存需求,可以考虑将BLOB列拆分为一个单独的表,并在需要时使用联接查询引用它。
2)由于检索和显示BLOB值的性能要求可能与其他数据类型非常不同,因此可以将特定于BLOB的表放在不同的存储设备上,甚至是单独的数据库实例上。例如,检索BLOB可能需要大的顺序磁盘读取,它比SSD设备更适合传统硬盘驱动器。
您可以引用这个现有的SO链接以及https://stackoverflow.com/questions/5318961/optimizing-mysql-files-in-database-blob
https://dba.stackexchange.com/questions/46543
复制相似问题