在一些情况中 , 一个查询能被优化来检索值,不用咨询数据文件 。如果对某些表的所有使用的列是数字型的并且构成某些键的最左面前缀 , 为了更快,值可以从索引树被检索出来 。
假定你发出下列SELECT语句:
mysql SELECT * FROM tbl_name WHERE col1=val1 AND col2=val2;
如果一个多列索引存在于col1和col2上,适当的行可以直接被取出 。如果分开的单行列索引存在于col1和col2上 , 优化器试图通过决定哪个索引将找到更少的行并来找出更具限制性的索引并且使用该索引取行 。
Mysql占用CPU过高如何优化CPU占用过高诊断思路
mpstat -P ALL 1mysql消耗过大怎么办,查看cpu使用情况mysql消耗过大怎么办,主要消耗在sys即os系统调用上
perf topmysql消耗过大怎么办,cpu主要消耗在_spin_lock
生成perf report查看详细情况
CPU主要消耗在mutex争用上 , 说明有锁热点 。
采用pt-pmp跟踪mysqld执行情况,热点主要集中在mem_heap_alloc和mem_heap_free上 。
Pstack提供更详细的API调用栈
Innodb在读取数据记录时的API路径为
row_search_for_mysql --》row_vers_build_for_consistent_read --》mem_heap_create_block_func --》mem_area_alloc --》malloc --》_L_unlock_10151 --》__lll_unlock_wait_private
row_vers_build_for_consistent_read会陷入一个死循环,跳出条件是该条记录不需要快照读或者已经从undo中找出对应的快照版本,每次循环都会调用mem_heap_alloc/free 。
而该表的记录更改很频繁,导致其undo history list比较长,搜索快照版本的代价更大,就会频繁的申请和释放堆内存 。
Linux原生的内存库函数为ptmalloc,malloc/free调用过多时很容易产生锁热点 。
当多条 SQL 并发执行时,会最终触发os层面的spinlock , 导致上述情形 。
解决方案
将mysqld的内存库函数替换成tcmalloc,相比ptmalloc,tcmalloc可以更好的支持高并发调用 。
修改my.cnf , 添加如下参数并重启
[mysqld_safe]malloc-lib=tcmalloc
上周五早上7点执行的操作,到现在超过72小时,期间该实例没有再出现cpu长期飙高的情形 。
以下是修改前后cpu使用率对比
mysql消耗过大怎么办的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于mysql耗cpu、mysql消耗过大怎么办的信息别忘了在本站进行查找喔 。
推荐阅读
- 电脑连接硬盘怎么连,电脑硬盘的连接
- Python中个标点符号作用,python中标点符号的用法
- 直播加加为什么卡,直播加加直播有声音吗
- 游戏革命开发,革命时代游戏
- php原生语句查询数据库 php原生类
- mongodb索引慢,mongo索引调优
- 搜索毕业设计软件下载安卓,搜毕业设计论文的软件
- linux挂载优盘命令 linux 挂载优盘
- 茶艺师如何营销,茶艺师销售话术