zkcrescent 的木屋

Mysql

MYSQL

常见问题一览

事务四大特性(ACID)

  • 原子性 atomic: 事务要么完成要么不完成
  • 一致性 consistent: 事务开始前后数据完整性约束保持不变
  • 隔离性 isolation: 两次事务的执行在同一时间上对同一数据仅有一个操作
  • 持久性 durable: 完成的事务将持久保存在数据库中,不会被回滚

存储

索引,采用B tree,树的一级会过百,所以层级很低,检索速度会很快,用红黑树会因为数据增加而导致树阶增高,检索速度下降(存储和ETCD相似,硬盘结构和内存块大小对应,一次读取一个硬盘块(预读,理论,局部性原理:一个数据使用时其前后数据的使用概率会很大))

优化

  1. 减少冗余(节省空间)
  2. 增加冗余(减少Join)
  3. 拆表,让不同的数据处于不同物理分区,检索时只需要在对应分区上,检索,减少整表查询
    • 垂直拆分:不同表放在不同服务器上,IO竞争减少
    • 水平拆分:同表不同逻辑,比如购物单按男女拆分到不同机器,女性购物单(女性购物居多)放到IO密集的SERVER,这样可以

mysql isam

支持表锁,包括写独占锁和读共享锁,类似MUTEX,读共享,读写,写写互锁

mysql innodb

支持事务,行锁

包括 共享锁,S锁(读锁)和X锁,排它锁(写锁)

基本的select ... from ...where ...不加锁

根据操作是否有写操作,如update , delete, insert, select for update 会加S锁,select in share mode 会加S锁

IS, IX锁(统称共享意向锁)

innodb中存在上述两种锁,是对应到表级别的读写锁,当需要获取行锁时,必须获取对应的表的意向锁,该锁由DB自己控制

锁实现

oracle 中锁是对数据行加锁,而 innodb 中是对索引加锁,意思是:当且从索引检索数据才会使用行锁,否则将会使用表锁,同时需要注意同表同索引检索,也会出现锁竞争