Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Mysql 详情 #62

Open
Petelin opened this issue Mar 11, 2021 · 0 comments
Open

Mysql 详情 #62

Petelin opened this issue Mar 11, 2021 · 0 comments

Comments

@Petelin
Copy link
Owner

Petelin commented Mar 11, 2021

Mysql MVCC

  1. COW 可以解决读写并行的问题

  2. MVCC 不光解决了读写并行,还解决了多个对象和集合写写并行

  3. MVCC需要一个全局递增的事务发号器,在开启事务时会获取到这个ID

  4. 每次Query都会产生一个Read View,读已提交和可重复读的区别就是 是不是每次Query都要生成新的Read View

  5. Read View 又三个重要的字段

    low_limit_id int  // 目前出现过的最大的事务ID+1,即 下一个将被分配的事务ID
    up_limit_id int // 活跃事务列表trx_ids中最小的事务 ID
    trx_ids []int  // Read View创建时其他未提交的活跃事务 ID列表
    
  6. undo log 记录的数据样式
    image

  7. query 的时候,可⻅性比较算法

    trx_id < up_limit_id -> 一定可见

    trx_id >= low_limit_id -> 一定不可见

    在这两者之间,需要在trx_ids中二分查找。 undo log里面记录的

Log

  1. bin log 是逻辑日志,类似于业务数据变更写入到kafka
  2. Redo log 其实是WAL log, 利用顺序写入速度快的特性完成持久化
  3. Undo log是为了完成MVCC和Atomic,提供事务回滚的能力。

索引

帮助数据库系统高效获取数据的数据结构

为什么能做到这一点呢?

通过增加额外的写操作,与用于维护索引数据结构的存储空间为代价的,用于提升数据库中数据检索效率的数据结构

索引从组织形式上分为: 聚集索引 和 非聚集索引(辅助索引或二级索引)。

从索引的实际应用中,又可以细分为普通索引、唯一索引、主键索引、联合索引、外键索引、全文索引

联合索引的实现: 按照顺序把key 拼接在一起当作一个单独的key建立索引就可以了, 因为B+树是有顺序的

B树也就是B-树, 和 B+树的区别是,B+树在叶子节点会存数据,非叶子节点存的都是索引数据。这样能更好的利用磁盘读写

大表删除大多数数据

删除大表上的多行数据时,innodb会超出lock table size的限制,最小化的减少锁表的时间的方案是:

  1. 直接删:
    1. 有索引 lock table size
    2. 无索引锁整个表,卡死
  2. 应该先查出来id然后by id 列表删,速度慢
  3. 如果删除的都是(,aID) 那么通过id删除加limit是最快的
  4. mysql 文档条件筛选导入新表,这个是官方文档提供的一种方式
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant