zoukankan      html  css  js  c++  java
  • MYSQL实战

    基础架构

    更新操作

    日志模块

    redo log 和 binlog

    两阶段提交: prepare commit

    事务隔离

    读未提交:别人改数据的事务尚未提交,我在我的事务中也能读到。
    读已提交:别人改数据的事务已经提交,我在我的事务中才能读到。
    可重复读:别人改数据的事务已经提交,我在我的事务中也不去读。
    串行:我的事务尚未提交,别人就别想改数据。
    这4种隔离级别,并行性能依次降低,安全性依次提高。 

    索引

    有一个主键列为ID的表,表中有字段k,并且在k上有索引。

    主键索引的叶子节点存的是整行数据。在InnoDB里,主键索引也被称为聚簇索引(clustered index)。

    非主键索引的叶子节点内容是主键的值。在InnoDB里,非主键索引也被称为二级索引(secondary index)。

    • 如果语句是select * from T where ID=500,即主键查询方式,则只需要搜索ID这棵B+树;
    • 如果语句是select * from T where k=5,即普通索引查询方式,则需要先搜索k索引树,得到ID的值为500,再到ID索引树搜索一次。这个过程称为回表。

     1、覆盖索引:如果查询条件使用的是普通索引(或是联合索引的最左原则字段),查询结果是联合索引的字段或是主键,不用回表操作,直接返回结果,减少IO磁盘读写读取正行数据

    2、最左前缀:联合索引的最左 N 个字段,也可以是字符串索引的最左 M 个字符
    3、联合索引:根据创建联合索引的顺序,以最左原则进行where检索,比如(age,name)以age=1 或 age= 1 and name=‘张三’可以使用索引,单以name=‘张三’ 不会使用索引,考虑到存储空间的问题,还请根据业务需求,将查找频繁的数据进行靠左创建索引。
    4、索引下推:like 'hello%’and age >10 检索,MySQL5.6版本之前,会对匹配的数据进行回表查询。5.6版本后,会先过滤掉age<10的数据,再进行回表查询,减少回表率,提升检索速度

    数据库锁

    全局锁

    表锁

    行锁

    策略:

    • 一种策略是,直接进入等待,直到超时。这个超时时间可以通过参数innodb_lock_wait_timeout来设置。
    • 另一种策略是,发起死锁检测,发现死锁后,主动回滚死锁链条中的某一个事务,让其他事务得以继续执行。将参数innodb_deadlock_detect设置为on,表示开启这个逻辑。

     索引

    对索引字段做函数操作,可能会破坏索引值的有序性,因此优化器就决定放弃走树搜索功能。

    间隙锁在可重复读隔离级别下才有效,解决幻读

     MySQL主备

    在决定哪个表做驱动表的时候,应该是两个表按照各自的条件过滤,过滤完成之后,计算参与join的各个字段的总数据量,数据量小的那个表,就是“小表”,应该作为驱动表。

  • 相关阅读:
    HDU2059(龟兔赛跑)
    pat 1012 The Best Rank
    pat 1010 Radix
    pat 1007 Maximum Subsequence Sum
    pat 1005 Sign In and Sign Out
    pat 1005 Spell It Right
    pat 1004 Counting Leaves
    1003 Emergency
    第7章 输入/输出系统
    第六章 总线
  • 原文地址:https://www.cnblogs.com/huilei/p/10571478.html
Copyright © 2011-2022 走看看