我们在aws上调试MySQL5.6时遇到问题,正在寻找指针来解决一些性能问题。
我们以前有专门的服务器,我们可以按自己的喜好配置它们。
我们的应用程序使用了很多临时表,在这方面没有性能问题。
直到我们切换到aws rds示例。
现在,许多缓慢的查询出现在日志中,这会减慢整个应用程序的速度。
以前我们使用MySQL5.4,现在是5.6。
通过查看文档,我们发现了一些关于临时表默认格式的更改。
默认情况下,它是innodb,我们将它设置回myisam,就像我们习惯了一样,并在这方面进行了改进。
第一个方面:
而且,我们的数据库相当大,有数百个同时访问我们的应用程序的数据库,有些表需要实时计算。在这种情况下使用join和unions。
在开发应用程序(使用mysql 5.4)时,我们发现将较大的查询拆分为2个或更多步骤并使用中间表,总体性能得到了提高。 Explain
显示了文件排序和临时文件,以便我们可以摆脱那些临时表。
将查询拆分为临时表真的是个好主意吗?
我们知道内存临时表到磁盘的隐式转换的条件。
另一件我们不确定的事情是什么使得查询使用临时文件?
我们知道使用正确的索引是一种方法(where子句中正确的顺序用法 order by
等等…),但我们还能做些什么吗?
第二方面:
关于我们正在使用的一些设置,我们有大约100 mb的内存 max_heap_table_size
以及 tmp_table_size
所以我们希望我们的临时table能留作纪念。
我们还找到了描述readiops和writeiops的文章。
读取是稳定和低,但写入显示不稳定和高数字。
下面是一个图表:
纵轴上的值为操作/秒。
我们如何解释这些数字?
关于我们的应用程序,需要知道的一点是,每个用户操作都记录到一个大的logs表中。但应该是每页加载一次。
第三方面:
这些设置能让临时表在内存中使用多久?
例如,我们读了一些文章,解释它们设置了几gb的内存 max_heap_table_size
在一个有12gb内存的专用mysql服务器上(听起来像是80%左右)
我们真的可以试试吗(同样的设置是否适用于rds?)另外,我们可以设置 innodb_buffer_pool_size
同样的价值?
注意,我找不到找到这些信息的文章,但我可能混淆了一些参数名称。如果我再找到问题的来源,我会修改这个问题。
服务器的设置和我们以前有很大的不同(aws上的新服务器不是我们设置的),很多设置值都增加了,也有一些减少了。
我们担心这不是一件好事…
以下是一些值得注意的变化:
innodb\缓冲区\池\大小(增加6)
innodb\日志\缓冲区\大小(减少/4)
innodb\附加\内存\池\大小(减少/4)
排序缓冲区大小(减少/2)
myisam\u sort\u buffer\u size(增加了1279)(我们只有innodb表,需要触摸吗?)
读取缓冲区大小(增加2)
连接缓冲区大小(减少/4)
读取缓冲区大小(增加4)
tmp\表\大小+最大\堆\表\大小(增加*8)
有些变化在我们看来很奇怪(比如 myisam_sort_buffer_size
),我们认为首先使用相同的设置会更好。
我们能有一些关于这些变量的指针吗(抱歉,我们无法提供确切的数字)
另外,有没有一篇好文章我们可以读到,总结了所有这些参数之间的良好平衡?
因为我们担心内存中不适合使用临时表,所以我进行了该查询,以查看实际写入磁盘的查询的百分比:
select
tmp_tables
,tmp_tables_disk
,round( (tmp_tables_disk / tmp_tables) * 100, 2 ) as to_disk_percent
from
(select variable_value as tmp_tables from information_schema.GLOBAL_STATUS where variable_name = 'Created_tmp_tables') as s1
,(select variable_value as tmp_tables_disk from information_schema.GLOBAL_STATUS where variable_name =
'Created_tmp_disk_tables') as s2
结果是10~12%(取决于示例)。有那么高吗?
热释光;博士
我试着给这个问题添加尽可能多的关于当前形势的细节,我希望这不会让任何事情变得更加混乱。。。
问题在于写作。有没有办法诊断是什么导致了这么多的书写(可能链接到临时表?)
1条答案
按热度按时间k97glaaz1#
MySQL5.4从未存在过。也许是5.4?
临时表,即使看起来不影响性能,也是可以改进的线索。
你有
TEXT
不需要获取的列(这会迫使内存中的临时表变成磁盘上的。)你有
TEXT
可以是更小的列VARCHAR
? (同样的原因。)你明白吗
INDEX(a,b)
可能比INDEX(a), INDEX(b)
? ("综合指数缓冲池对于性能非常重要。你认为
innodb_buffer_pool_size
改变?你有多少数据?你有多少公羊。一般来说,“您无法调整您的方式来解决性能问题”。
这是数据仓库应用程序吗?构建和维护摘要表通常是dw“报告”的一个巨大性能提升。
myisam只有表锁定。这会导致阻塞,从而导致各种性能问题,尤其是减慢查询速度。我很惊讶innodb比你慢。myisam是个死胡同。当你达到8.0的时候,会有更强有力的理由去转换。
让我们看看一个得益于拆分的慢查询。有几种技术可以让复杂的查询运行得更快(至少在innodb中是这样)。
秩序
ANDed
事物WHERE
没关系。这在综合指数中确实很重要。改变
tmp_table_size
很少帮助或伤害。但是,它应该保持在ram的1%以下——这是为了避免耗尽ram。交换是最糟糕的事情。图形-y轴单位是什么?这些图表是从哪里来的?它们看起来没用。
“共gb
max_heap_table_size
在一个有12gb内存的专用mysql服务器上(听起来像80%左右“——再看看那篇文章。我建议那台机器的设置是120米。在12gb机器上独占使用myisam时,
key_buffer_size
应该在2400米左右innodb_buffer_pool_size
应为0。在12gb机器上独占使用innodb时,
key_buffer_size
应该在20米左右innodb_buffer_pool_size
应该是8克。你在测试innodb的时候改变了这些吗?innodb_additional_mem_pool_size
--未使用,最终被移除。myisam_sort_buffer_size
--12克机器上250米。如果只使用innodb,则可以忽略该设置,因为不会使用该缓冲区。至于*6和/4——我需要看实际尺寸来判断任何东西。
“总结了所有这些参数之间的良好平衡”--两件事:
http://mysql.rjweb.org/doc.php/memory
剩下的都是默认值。
有关更多调整建议以及slowlog建议,请参阅http://mysql.rjweb.org/doc.php/mysql_analysis