我不是DBA,所以需要一些关于调优MySQL (MyISAM)数据库的建议。我发现,在高峰时段,我们的负载尖峰非常严重,减缓了网络前端的速度。
我还使用JMeter对服务器运行测试,对于20个并发用户,加载峰值达到400%。这看起来不正常。
我运行了MySQL调谐器,并且已经标记了以下内容:
[!!] Query cache prunes per day: 4351 [!!] Joins performed without indexes: 155460 [!!] Table cache hit rate: 0% (1K open / 11M opened)
查询缓存剪枝看起来很直接,我认为我可以安全地将它增加到100 to,而不需要任何负面的可伸缩性。
当我的所有表都被索引时,“没有索引的联接”使我感到困惑。这更可能是使用非索引列查询的问题吗?
表缓存命中率也是我不确定的。Open_tables的数量从未减少到1000以下,这意味着表永远不会关闭。1000是table_open_cache在我的配置中的值。
发布于 2015-07-10 23:34:03
负载峰值达到400%
这可能意味着您是CPU绑定,而不是I/O绑定。因此,您有大量的RAM,但是查询效率很低。
!!!查询缓存每天修剪: 4351
在大多数生产系统中,写通信量太高,因此应该关闭查询缓存。还有其他指标可以进一步证明这一点。
在没有索引的情况下执行!!!连接: 155460
对于小桌子来说,这并不重要。即使是小桌子,这也可能很重要。
用long_query_time = 1打开慢速日志;等待一天;运行pt-查询摘要。然后向我们展示第一个调皮的查询,以及SHOW CREATE TABLE和EXPLAIN SELECT ...。这很可能包括“非索引联接”最严重的违反者。
!!!表缓存命中率: 0% (1K打开/ 11M打开)
你有1000多张桌子吗?你还在积极使用1000多?这听起来像是糟糕的架构设计。请详细说明为什么有这么多桌子。(同时,将table_open_cache提高到例如2000年,并将table_open_cache_instances设置为16 (假设您正在运行至少5.6.6)。
去query_cache_size的时候不要超过100米。当它变得更大的时候它就变得低效了。
在我看来,log-queries-not-using-indexes是杂乱无章的,而不是好处。
有关修复索引的先头信息,请参见我的食谱。
如果您想要更多的测试(比该工具所做的更多),请向我提供
SHOW VARIABLES;SHOW GLOBAL STATUS;它将包括对QC是否有用的分析。
发布于 2015-07-10 15:35:56
您的性能问题很可能通过修复第二个问题来解决:没有索引的联接。如果您要对查询中的非索引列进行联接,则必须做更多的工作来确定1)是否有匹配,以及2)哪些匹配。
您可以在MySQL配置(my.cnf)中使用log选项log查询而不是使用索引来记录这些查询。从这里,您可以创建适当的索引来覆盖联接操作,或者修改联接以使用现有的键列/索引。解释可以帮助您理解引擎本身在执行查询时所做的事情。
一旦解决了这个问题,调整缓存应该会提高一些性能,但是修复连接并提高它们的效率将使服务器能够运行更快的速度,即使缓存不是温的。
https://dba.stackexchange.com/questions/106594
复制相似问题