公司在业务发展初期,为了将产品快速投入市场验证商业模式或适应市场需要业务快速迭代,对系统架构设计要求较低。随着业务的不断发展系统和数据量也逐渐庞大,对系统性能和稳定性要求却越来越高,但此时系统性能逐渐开始显露瓶颈,没错~ 这是前期埋下的技术债开始浮出水面。
那我们如何解决性能瓶颈问题呢? 老程序员们都知道70%以上的性能瓶颈在数据库,因为慢SQL导致了性能瓶颈。
那么如何优化慢SQL呢?如何避免慢SQL呢?
OSCHINA 本期高手问答(1 月 3 日 - 1 月 9 日)我们请来了嘉宾高峰老师和大家一起聊聊优化慢 SQL 那些事。
可讨论的问题包括但不限于:
- 慢SQL发生的场景
- 慢SQL优化思路
- 慢SQL优化案例
- 如何避免慢SQL
- 分库分表的架构设计
其他相关的问题,也欢迎提问!
嘉宾介绍
高峰,京东物流架构师,10年以上架构设计和性能优化经验,支持京东物流集团国际技术部商家平台订单异步化的架构设计和落地,分布式文件存储系统的架构设计,慢SQL性能优化解决方案和优化工作推进等。
2022年获得《京东物流最佳贡献奖》
2023年获得《京东物流年度最佳设计奖》
🎁 为了鼓励踊跃提问,问答结束后我们将从提问者中抽取 5 名幸运会员,赠予京东joy公仔一个。
OSChina 高手问答一贯的风格,不欢迎任何与主题无关的讨论和喷子。
下面欢迎大家就 “优化慢 SQL ” 相关问题向 高峰老师 提问,直接回帖提问既可。
引用来自“xiaour”的评论
@京东云开发者 您好,我们平时在性慢SQL优化的时候,更多的是针对SQL本身进行调优,很少对产品设计或者交互逻辑进行调整。那么很多慢SQL优化的效果一般不会得到非常显著的提升的;请问下您平时有没有说从产品设计层面调整的情况?或者怎么去说服产品经理调整设计的呢?
我感觉这种情况下,还是要看技术团队是否有话语权,整个团队是否有工程师文化。况且有些时候,确实是产品层面规划混乱进而导致的技术服务层和数据层的混乱。
@京东云开发者 您好,之前遇到一个使用场景,大概16万的数据,倒序连表查询的情况下,分页页码越到后面sql运行速度越慢,我尝试过使用子查询来限定查询范围,但是子查询的条件也需要连表查询,导致性能并没有提升多少,我也查看过sql的执行计划,where 条件的字段都触发了索引,我甚至还记录过上一页码的最后一个ID,用来作为下一页的ID筛选条件,但是前端如果是从第一页跳转到6,7千页码也会比较慢,请问遇到这个问题,我们应该从哪些方面来解决这个问题。
我对慢“SQL的避免和优化”的一点点想法,大概就是三步。
1.合理设置索引
2.正确使用索引
3.学会查看执行计划并养成习惯
@京东云开发者 order by 语句放内层排序还是放最后排序 对SQL速度有影响吗
@京东云开发者 您好,我们平时在性慢SQL优化的时候,更多的是针对SQL本身进行调优,很少对产品设计或者交互逻辑进行调整。那么很多慢SQL优化的效果一般不会得到非常显著的提升的;请问下您平时有没有说从产品设计层面调整的情况?或者怎么去说服产品经理调整设计的呢?
@京东云开发者 最近工作上是在做一个统计的功能, sql慢的原因不是sql有问题,是数据表设计得有问题, 该建索引的字段没建索引, 还遇到了表字段太多,字段类型不合理,很多text类型, 数据量太大这些情况, 导致查询太慢, 表字段很多统计的时候其实不需要用,所以我想了从源表抽几个字段作为一张新表进行统计, 用的mysql数据库,只找到建触发器来同步源表和新表的数据这种方法, 想问一下如果把需要统计的字段放到一个组合索引里是不是和建少字段新表一样的效果
@京东云开发者
最近遇到一个问题,删除大量数据后,碎片较多,通过 alter table xx engine = InnoDB优化表碎片空间,导致Iops占用非常高,持续大约10几分钟。目前在凌晨低峰期执行,暂未遇到问题,想问下是否有更好的设计方案。
基本情况:云上数据库mysql,磁盘总大小30G,该表单日写入数据量500万,只保留5天的数据,需要提供查询。存储6天的数据,磁盘占用大概10GB,其中数据空间大概5GB,索引5GB。每天定时任务删除5天前的数据,删除后碎片大概占1GB,如果不进行碎片整理,时间久了会影响存储。在不更换数据库的前提下,是否有更好的设计方案
@京东云开发者
你好,最近准备上线一个功能,需要新建表,关于表主键是用自增,uuid,雪花Id等,和同事产生了分歧😂,能指导下用哪种方式么?
centos7,oracle数据库,一年能产生600W条数据
@京东云开发者
你好,最近准备上线一个功能,需要新建表,关于表主键是用自增,uuid,雪花Id等,和同事产生了分歧😂,能指导下用哪种方式么?
centos7,oracle数据库,一年能产生600W条数据
@京东云开发者 您好!之前收到过用户的一个卡顿反馈,调研后发现一个典型的慢查询SQL中,检索项没有建索引,我们尝试增加索引之后这条SQL提速显著,交给用户试用后,又报了其他SQL的慢查询了。想请教一下,如何权衡DB系统中的索引使用呢?