• MySQL千万级大表优化策略


    =========优化的顺序===============
    (是根据MySQL优化的效果和优化所需的成本)
    第一 优化你的sql和索引;
      sql中的一些in、join等子查询效率完全可以用表连接来代替;索引一般是根据sql语句来建立,并且最好和主键或者用户常用的条件相关。
    第二 做归档,可以根据表数据的业务类型进行归档。也可以看做是表的数据条数拆分。
      比如tc_history库的数据,根据时间进行归档操作,将原来的trade_order_detail表按某时间字段(一般以有索引的业务时间字段midified)拆分为trade_order_detail_2013等等。
    第三 加缓存,memcached,redis;
      缓存式数据库需要搭配源码搭建的数据库。与阿里云的RDS估计不大行。
    第四  主从复制或主主复制,读写分离,可以在应用层做,效率高,也可以用三方工具,第三方工具推荐360的atlas;
    第五 mysql自带分区表,对应用透明,无需更改代码,但是sql语句是需要针对分区表做优化的,sql条件中要带上分区条件的列,从而使查询定位到少量的分区上,否则就会扫描全部分区,;
    第六  先做垂直拆分,其实就是根据模块的耦合度,将一个大的系统分为多个小的系统,也就是分布式系统;
      第二点的归档操作需要考虑归档表对业务上的影响(比如归档之后的表是否只需要查询,可以合理更换引擎tokudb等等);
    第七  水平切分,针对数据量大的表,这一步最麻烦,最能考验技术水平,要选择一个合理的sharding key,为了有好的查询效率,表结构也要改动,做一定的冗余,应用也要改,sql中尽量带sharding key,将数据定位到限定的表上去查,而不是扫描全部的表;
    水平切分大致就是指将一张数据表中的字段切分,然后存储在多个数据表中,但这样的话,势必会需要程序代码和数据结构有较大的改动。
    例如根据tenant取模来分库就是横向扩展;分库会使单表的数据量减少(tc减半),数据量一旦减小的话,很多问题都可以迎刃而解。
    (拆分来提高表的访问效率:)
     
    =====综合业务特点=======
    对于一个存储设计,必须考虑业务特点,收集的信息如下:
    1.数据的容量:1-3年内会大概多少条数据,每条数据大概多少字节;
      表informaton_schema.tables 字段:table_rows和avg_row_length
    2.数据项:是否有大字段,那些字段的值是否经常被更新;
      字段类型是否有text或者blob;另外varchar字段为null的数据,索引效率也是极其低的。
    3.数据查询SQL条件:哪些数据项的列名称经常出现在WHERE、GROUP BY、ORDER BY子句中等;
      一般出现order by create_Date这些语句的时候,表的设计一刚开始就应该设计为id自增,然后以id 去order by 或者直接找到准确的id
    4.数据更新类SQL条件:有多少列经常出现UPDATE或DELETE 的WHERE子句中;
    5.SQL量的统计比,如:SELECT:UPDATE+DELETE:INSERT=多少?
    6.预计大表及相关联的SQL,每天总的执行量在何数量级?
    7.表中的数据:更新为主的业务 还是 查询为主的业务
    8.打算采用什么数据库物理服务器,以及数据库服务器架构?
    9.并发如何?
    10.存储引擎选择InnoDB还是MyISAM?
    一般会选择使用innodb引擎,表结构不方便更改的情况下,多利用内存,减轻IO负载,数据库的瓶颈一般都会卡在IO上;
  • 相关阅读:
    截取图片中间部分
    chrome调试手机webview中页面
    页面中如何让标点不出现在行首
    jquery checkbox checked 却不显示对勾
    thinkphp 5.x No input file specified 解决
    常用的一些子域名,旁站等查询网站
    Windows应急日志常用的几个事件ID
    fsockopen反弹shell脚本
    LOG日志溯源取证总结
    交互式shell脚本web console
  • 原文地址:https://www.cnblogs.com/Kid-Zhou/p/8276263.html
Copyright © 2020-2023  润新知