很多人第一反应是各种切分;
我给的顺序是:

第一 优化你的sql和索引

第二 加缓存,memcached,redis

第三 以上都做了后,还是慢,就做主从复制或主主复制,读写分离,可以在应用层做,效率高,也可以用三方工具,第三方工具推荐360的atlas,其它的要么效率不高,要么没人维护;

第四 如果以上都做了还是慢,不要想着去做切分,mysql自带分区表,先试试这个,对你的应用是透明的,无需更改代码,但是sql语句是需要针对分区表做优化的,sql条件中要带上分区条件的列,从而使查询定位到少量的分区上,否则就会扫描全部分区,另外分区表还有一些坑,在这里就不多说了

第五 如果以上都做了,那就先做垂直拆分,其实就是根据你模块的耦合度,将一个大的系统分为多个小的系统,也就是分布式系统;把一个数据库,根据业务的耦合度、功能的划分,拆成若干个小的库。

第六才是水平切分,针对数据量大的表,这一步最麻烦,最能考验技术水平,要选择一个合理的sharding key,为了有好的查询效率,表结构也要改动,做一定的冗余,应用也要改,sql中尽量带sharding key,将数据定位到限定的表上去查,而不是扫描全部的表;

mysql数据库一般都是按照这个步骤去演化的,成本也是由低到高;有人也许要说第一步优化sql和索引这还用说吗?的确,大家都知道,但是很多情况下,这一步做的并不到位,甚至有的只做了根据sql去建索引,根本没对sql优化(中枪了没?),除了最简单的增删改查外,想实现一个查询,可以写出很多种查询语句,不同的语句,根据你选择的引擎、表中数据的分布情况、索引情况、数据库优化策略、查询中的锁策略等因素,最终查询的效率相差很大;优化要从整体去考虑,有时你优化一条语句后,其它查询反而效率被降低了,所以要取一个平衡点;即使精通mysql的话,除了纯技术面优化,还要根据业务面去优化sql语句,这样才能达到最优效果;你敢说你的sql和索引已经是最优了吗?

再说一下不同引擎的优化,myisam读的效果好,写的效率差,这和它数据存储格式,索引的指针和锁的策略有关的,它的数据是顺序存储的(innodb数据存储方式是聚簇索引),他的索引btree上的节点是一个指向数据物理位置的指针,所以查找起来很快,(innodb索引节点存的则是数据的主键,所以需要根据主键二次查找);myisam锁是表锁,只有读读之间是并发的,写写之间和读写之间(读和插入之间是可以并发的,去设置concurrent_insert参数,定期执行表优化操作,更新操作就没有办法了)是串行的,所以写起来慢,并且默认的写优先级比读优先级高,高到写操作来了后,可以马上插入到读操作前面去,如果批量写,会导致读请求饿死,所以要设置读写优先级或设置多少写操作后执行读操作的策略;myisam不要使用查询时间太长的sql,如果策略使用不当,也会导致写饿死,所以尽量去拆分查询效率低的sql

innodb一般都是行锁,这个一般指的是sql用到索引的时候,行锁是加在索引上的,不是加在数据记录上的,如果sql没有用到索引,仍然会锁定表,mysql的读写之间是可以并发的,普通的select是不需要锁的,当查询的记录遇到锁时,用的是一致性的非锁定快照读,也就是根据数据库隔离级别策略,会去读被锁定行的快照,其它更新或加锁读语句用的是当前读,读取原始行;因为普通读与写不冲突,所以innodb不会出现读写饿死的情况,又因为在使用索引的时候用的是行锁,锁的粒度小,竞争相同锁的情况就少,就增加了并发处理,所以并发读写的效率还是很优秀的,问题在于索引查询后的根据主键的二次查找导致效率低

ps: 很奇怪,为什innodb的索引叶子节点存的是主键而不是像mysism一样存数据的物理地址指针吗?如果存的是物理地址指针不就不需要二次查找了吗,这也是我开始的疑惑,根据mysism和innodb数据存储方式的差异去想,你就会明白了,我就不费口舌了!

以innodb为了避免二次查找可以使用索引覆盖技术,无法使用索引覆盖的,再延伸一下就是基于索引覆盖实现延迟关联;不知道什么是索引覆盖的,建议你无论如何都要弄清楚它是怎么回事!尽你所能去优化你的sql吧!说它成本低,却又是一项费时费力的活,需要在技术与业务都熟悉的情况下,用心去优化才能做到最优,优化后的效果也是立竿见影的!

作者:zhuqz
原文连接

MySQL 对于千万级的大表要怎么优化?相关推荐

  1. MySQL 对于千万级的大表要怎么优化?(读写分离、水平拆分、垂直拆分)

    海豚精灵:https://www.whhtjl.com:优课GO:https://mgo.whhtjl.com 思考 如何设计或优化千万级别的大表?此外无其他信息,个人觉得这个话题有点范,就只好简单说 ...

  2. mysql大于等于怎么写_MySQL 对于千万级的大表要怎么优化?我写了6000字的深度解读...

    千万级大表如何优化,这是一个很有技术含量的问题,通常我们的直觉思维都会跳转到拆分或者数据分区,在此我想做一些补充和梳理,想和大家做一些这方面的经验总结,也欢迎大家提出建议. 从一开始脑海里开始也是火光 ...

  3. 排序千万级数据_MySQL 对于千万级的大表要怎么优化?我写了6000字的深度解读...

    千万级大表如何优化,这是一个很有技术含量的问题,通常我们的直觉思维都会跳转到拆分或者数据分区,在此我想做一些补充和梳理,想和大家做一些这方面的经验总结,也欢迎大家提出建议. 从一开始脑海里开始也是火光 ...

  4. mysql 压力测试知乎_MySQL 对于千万级的大表要怎么优化? - MySQL

    很多人第一反应是各种切分:我给的顺序是: 第一优化你的sql和索引: 第二加缓存,memcached,redis: 第三以上都做了后,还是慢,就做主从复制或主主复制,读写分离,可以在应用层做,效率高, ...

  5. 记录一次MySQL两千万数据的大表优化解决过程,提供三种解决方案

    问题概述 使用阿里云rds for MySQL数据库(就是MySQL5.6版本),有个用户上网记录表6个月的数据量近2000万,保留最近一年的数据量达到4000万,查询速度极慢,日常卡死.严重影响业务 ...

  6. 记录一次MySQL两千万数据的大表优化解决过程,提供三种解决方案 1

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 作者:王帅 来源地址:https://yq.aliyun.com/ ...

  7. 干 MySQL 两千万数据的大表优化解决过程,三种厉害的解决方案

    问题概述 使用阿里云rds for MySQL数据库(就是MySQL5.6版本),有个用户上网记录表6个月的数据量近2000万,保留最近一年的数据量达到4000万,查询速度极慢,日常卡死.严重影响业务 ...

  8. 【转载文章】记录一次MySQL两千万数据的大表优化解决过程,提供三种解决方案...

    问题概述 使用阿里云rds for MySQL数据库(就是MySQL5.6版本),有个用户上网记录表6个月的数据量近2000万,保留最近一年的数据量达到4000万,查询速度极慢,日常卡死.严重影响业务 ...

  9. MySQL大表关联如何优化_MySQL 对于大表(千万级),要怎么优化呢?

    http://www.zhihu.com/question/19719997 提问:如何设计或优化千万级别的大表?此外无其他信息,个人觉得这个话题有点范,就只好简单说下该如何做,对于一个存储设计,必须 ...

最新文章

  1. 亚洲最大的元宇宙平台,体验在豪宅里开party
  2. 使用javaHelp制作java swing帮助文档
  3. 并发编程实战-读书笔记
  4. 是什么动词_【术语攻略】什么是及物动词?
  5. docker搭建ssr
  6. hibernate 延迟加载(转载)
  7. 搭建CentOS7.6容器镜像
  8. (转)马云的江湖 PK 史玉柱的兵法
  9. springboot 项目maven 打包错误
  10. Android 四大组件学习之Activity二
  11. 喝咖啡的好处和坏处及注意事项
  12. 程序员的必备装备——为健康加油
  13. Mac上使用IE浏览器
  14. Hutool Java 工具类库Excel导出,配置宽度自适应极度舒适
  15. 尚硅谷云原生实战视频教程发布
  16. Java全文搜索怎么弄的_全文搜索 简介
  17. mysql查询和更改时区
  18. apisix健康检查测试
  19. Gym - 101291I Mismatched Socks(贪心)
  20. NUIST萌萌新的比赛纪录

热门文章

  1. Tree Xor(未完全搞定)
  2. 牛客网【每日一题】7月21日题目精讲—区间权值
  3. CSP2019洛谷P5665:划分(单调队列,高精度)
  4. jzoj4786-[NOIP2016提高A组模拟9.17]小a的强迫症【数论】
  5. 初一模拟赛总结(3.23)
  6. 操作系统复习笔记 07 Process Synchronization 进程同步
  7. Hadoop入门(十三)远程提交wordCout程序到hadoop集群
  8. Java 0xffffffff隐式类型转换的坑
  9. 深入理解TCP/IP协议-TCP建立与终止连接
  10. 深入理解分布式系统中的缓存架构(下)