• 【Mysql】


    1.Mysql执行过程

    首先通过mysql连接器建立连接,然后会进入分析器对sql进行分析,优化器进行策略优化,最终执行器调用存储引擎执行语句,返回结果

    2.mysql的存储引擎

    最常见的innodb,事务型存储引擎

    还有MyIsam,适用于读多写少的场景,相比于innodb查询快的原因是:本身非聚簇索引,无需校验MVCC;直接存储行记录的地址,无需回表

    还有Memory

    2.1 存储引擎执行细节
    1.查询放入缓存
    2.修改数据页中数据(修改前undo log,修改后redo log)
    3.binlog刷盘(刷盘前prepare,刷盘后commit)
    
    • 1
    • 2
    • 3
    2.2 undo log、redo log和binlog

    undo log:存储历史值,每个指针指向上一个值

    redo log:随机IO改为顺序IO,支持反查(通过和binlog日志对比确定事务是否要提交)和回滚(至少能恢复到prepare阶段)

    binlog:真正刷盘时调用

    2.3 buffer pool的内存淘汰机制

    lru链表:用于维护热点数据的顺序问题,利用了最近最少使用算法

    防止全表查询,替换所有数据,会有热数据和冷数据的区别,有一个时间间隔参数进行区分,只有在这个指定时间段后再次被访问才会被刷入热数据区

    3.事务和隔离级别

    3.1 ACID

    A原子性:靠undolog

    D持久性:靠redo log

    I隔离性:靠MVCC和临键锁

    C一致性:靠以上三者共同保证

    3.2 隔离级别

    read uncommited:已读未提交,脏读

    read commited:已读已提交,不可重复读

    repeatable:可重复读,幻读,通过MVCC解决

    serializable :串行化读取

    3.3 MVCC解决幻读

    每条行记录都会有两个隐藏字段,分别是事务id(最后一次修改后记录的事务的id,txid)和回滚指针(指向他上一个修改前版本的undo log,串联起来会形成一个undo log版本链)

    1.每次开启事务会创建读视图将所有活跃的事务id保存起来,然后统计出最小的事务id和最大的事务id,

    2.然后第二次读会将修改的事务id会和我们的读事务id进行对别,如果修改事务id小于最小的读事务id,说明已经提交无需修改,如果在这之间或者大于则需要通过undolog回滚到对应的读事务id,

    3.rc(read commit)每次读都会生成读视图,rr(repeatable read)只有第一次读取会生成读视图

    4. 数据库调优

    4.1分库分表

    数据量达到单表1000w时,

    当innodb_buffer_pool_size(默认128m)大于物理机内存的75%时

    show global variables like 'innodb_buffer_pool_size';
    
    • 1
    4.2 从配置上调优
     vi /etc/my.cnf 
     
     log-bin=/var/lib/mysql/mysql-bin #开启binlog日志
     server-id=1
     max_user_connections=800 #最大用户连接数,默认0,表示不限制
     max_connections=3000  #MySql的最大连接数,默认151,当并发较多时可以适当调大
     back_log=500 # 等待队列,默认50,不超过cat /proc/sys/net/ipv4/tcp_max_syn_backlog数量
     wait_timeout=1800 # 最大闲置时间,默认8h,改为30分钟
     thread_concurrency=64 #线程并发数,默认8,应设cpu核数*2
     innodb_buffer_pool_size=1024M #InnoDB占用的内存,默认128m,16G内存最大可设12G有21%额外开销
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    调整innodb_buffer_pool_size时机:

    val = Innodb_buffer_pool_pages_data / Innodb_buffer_pool_pages_total * 100%
    val > 95% 则考虑增大 innodb_buffer_pool_size, 建议使用物理内存的75%
    val < 95% 则考虑减小 innodb_buffer_pool_size, 建议设置为:Innodb_buffer_pool_pages_data * Innodb_page_size * 1.05 / (102410241024)G

    show global status like 'Innodb_buffer_pool_pages_data';
    show global status like 'Innodb_page_size';
    
    • 1
    • 2
    4.3 查询设计调优

    1.尽可能使用索引,包括主键索引、覆盖索引和

    2.查询控制在3层表内

    3.慢查询优化通过explain、show profile等

  • 相关阅读:
    第四章运算符
    The Foundry Nuke 15视频后期合成和特效制作Mac软件
    FIFO深度计算学习记录(汇总)
    ssm springboot网络订餐点餐跑腿系统java 小程序025
    在线答题+考试出题小程序源码系统,轻松无忧,功能强大
    haoop启动正常,但上不去网页hadoop102:9870
    【杂烩】TeX Live+TeXStudio
    【Django使用】4大模块50页md文档,第4篇:Django请求与响应和cookie与session
    项目中的自定义注解
    自学(网络安全)黑客——高效学习2024
  • 原文地址:https://blog.csdn.net/qq_36015612/article/details/126926192