一技MySQL调优小淫技 & 分布式事务常用姿势

Posted 西二旗阵地上的Tsinghua兵

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一技MySQL调优小淫技 & 分布式事务常用姿势相关的知识,希望对你有一定的参考价值。

1. mysql中in子句在数万量级数据的临时子表中的性能问题,改为inner join的优化点:

        问题场景:在手工使用sql修复指数因is_new误置位2引起pv合并重复入库问题时,发现一条sql执行数十小时仍无返回,同时伴随锁行。

        问题排查及总结:

        1-1. 性能问题严重的原始sql执行计划如下:

            窝草,发现in子句会遍历12亿条数据且没走索引,惊不惊喜

一技MySQL调优小淫技 & 分布式事务常用姿势

        1-2. 调优:

            参看MySQL in子句相关文档,5.7之前都建议将in子表语句改为inner join语句进行优化。

一技MySQL调优小淫技 & 分布式事务常用姿势            优化后sql如下:执行效率提升数百倍。

一技MySQL调优小淫技 & 分布式事务常用姿势            最终调数sql如下:

            delete c from kwd_pv_search_all c, (select a.id as id from (select count(*) as count,date,kwd_id,id from kwd_pv_search_all where kwd_id >= 1 and kwd_id <= 20000 group by kwd_id,date order by date desc) as a where a.count > 1) b where c.id = b.id;

        综上,选择合理的sql、使用explain查看执行计划对sql进行调优,能显著提升系统性能。

        后记:细心的你可能发现了,What a fuck!什么表存了12亿的数据?性能不会很差?这是一个pv数据表,字段较少且都为bigint或者int型(虽然也会关联数亿的文章数据表);数据库做了主从、读写分离,并且线上服务为只读,写入为Hadoop MapReduce任务天级批量灌入。数据库机器128G内存、64core、2T SSD,3000+QPS妥妥的。


2. 关于分布式事务的常用姿势:

        既然说到了数据库,那就不得不提提事务。分享一篇看过比较清晰的概述了分布式事务(1/2/3阶段提交、TCC、本地消息表、事务消息、业务补偿等原理)的文章。

        拉屎时意外收获,与君共享

        

libo09@mails.tsinghua.edu.cn

以上是关于一技MySQL调优小淫技 & 分布式事务常用姿势的主要内容,如果未能解决你的问题,请参考以下文章

十个Python性能调优小技巧,你知道几个?

Spark调优小表join大表数据倾斜解决方案

分布式事务--JAVA性能调优笔记

MYSQL 那点破事!索引SQL调优事务B+树分表 ....

Day810.MySQL调优之事务:高并发场景下的数据库事务调优 -Java 性能调优实战

Day818.电商系统的分布式事务调优 -Java 性能调优实战