mysql大表更新sql的优化策略
2013-12-19 21:38
288 查看
问题sql背景:项目有6个表的要根据pid字段要写入对应的brand_id字段。但是这个其中有两个表是千万级别的。我的worker运行之后,线上的mysql主从同步立刻延迟了!运行了一个多小时之后,居然延迟到了40分钟,而且只更新了十几万行数据。问题sql如下:
项目组的mysql专家帮我分析了下,因为pid字段没有索引,mysql引擎要逐行扫描出与传入的pid值相等的列,然后更新数据,也就是要扫描完1000W+行磁盘数据才能执行完这个sql。更严重的是,这个千万级的表里面有多少个不同的pid,我就要执行多少个这样的sql。
同事给我的建议的根据id字段进行sql代码层次的纵向分表。每次更新1000行的数据,这样mysql引擎就不用每次在扫全表了,数据库压力是之前的万分之一。而且id作为主键,是有索引的有索引,有索引能大大优化查询性能,优化后的sql如下:
仅仅用了id限区间的语句,将一个千万级的大表代码层次上进行纵向切割。重新上线worker后,mysql主从没有任何延迟!而且经过监视,短短10分钟就更新了十几万数据,效率是之前的6倍!更重要的是数据库负载均衡,应用健康运行。
<!-- 根据商品id更新品牌id --> <update id="updateBrandIdByPid" parameterClass="com.**.chat.worker.domain.param.UpdateBrandIdParam"> UPDATE $tableName$ SET brand_id = #newBrandId# WHERE pid = #pid# AND brand_id = 0 </update>
项目组的mysql专家帮我分析了下,因为pid字段没有索引,mysql引擎要逐行扫描出与传入的pid值相等的列,然后更新数据,也就是要扫描完1000W+行磁盘数据才能执行完这个sql。更严重的是,这个千万级的表里面有多少个不同的pid,我就要执行多少个这样的sql。
同事给我的建议的根据id字段进行sql代码层次的纵向分表。每次更新1000行的数据,这样mysql引擎就不用每次在扫全表了,数据库压力是之前的万分之一。而且id作为主键,是有索引的有索引,有索引能大大优化查询性能,优化后的sql如下:
<!-- 根据商品id更新品牌id --> <update id="updateBrandIdByPid" parameterClass="com.**.chat.worker.domain.param.UpdateBrandIdParam"> UPDATE $tableName$ SET brand_id = #newBrandId# WHERE pid = #pid# AND brand_id = 0 AND id BETWEEN #startNum# AND #endNum# </update>
仅仅用了id限区间的语句,将一个千万级的大表代码层次上进行纵向切割。重新上线worker后,mysql主从没有任何延迟!而且经过监视,短短10分钟就更新了十几万数据,效率是之前的6倍!更重要的是数据库负载均衡,应用健康运行。
相关文章推荐
- mysql大表更新sql的优化策略(转)
- mysql大表更新sql的优化策略
- 关于Mysql SQL优化的总结,持续更新中
- MySQL的SQL执行性能分析以及性能优化策略和步骤
- MySql更新优化策略
- 数据库优化<二>SQL优化之SELECT优化 ——mysql内部优化策略
- MySql更新优化策略
- MySQL对于千万级的大表要怎么优化(SQL语句的优化)?
- mysql优化(三)–explain分析sql语句执行效率
- [原创]MySQL中SQL优化和架构设计的一些简单想法
- Mysql性能优化案例研究 - 覆盖索引和SQL_NO_CACHE
- SQL优化的思路及基本原则(mysql)
- 性能优化之MySQL优化(二)- explain分析SQL
- [MySQL优化] -- 如何定位效率较低的SQL
- MySQL海量数据查询优化策略
- 浅谈MySQL中优化sql语句查询常用的30种方法
- MySQL大表优化方案
- 浅谈mysql配置优化和sql语句优化
- MySQL 数据库性能优化第四篇文章之SQL优化
- 【mysql】sql语句优化