Category Archives: MySQL

MySQL 普通索引和唯一索引

By | 17 2 月, 2021

问题引入

假设在维护一个市民系统,每个人都有一个唯一的身份证号,而且业务代码已经保证了不会写入两个重复的身份证号。如果市民系统需要按照身份证号查姓名,就会执行类似的 SQL:

select name from user where id_card = 'xxx';

所以,我们一定会考虑在 id_card 字段上建索引。

由于身份证号字段比较大,所以它不适合当做主键。那么 id_card 字段是要创建唯一索引还是普通索引呢?此处假设业务代码已经保证了不会写入重复的身份证号,这两个选择在逻辑上都是正确的。…

MySQL 索引

By | 14 2 月, 2021

索引分类

索引类型分为 主键索引非主键索引

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

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

基于主键索引和普通索引的查询有什么区别?

  • 如果语句是 select * from T where id=500 这种主键查询方式,则只需要搜索 id 这个索引对应的

MySQL 日志模块

By | 13 2 月, 2021

MySQL 里如果每一次的更新操作都写磁盘的话,那么这个过程中磁盘要找到对应的那条记录,然后再更新,整个过程中的 IO 成本、查找成本都很高,所以 MySQL 中采用了 WAL(Write-Ahead Logging)技术来解决这个问题。

关键点是:先写日志,再写磁盘

redo log

redo log 是 InnoDB 引擎特有的日志。

当有一条记录需要更新的时候,InnoDB 引擎就会先把记录写到 redo log 中,并更新内存,这个时候更新就算完成了。同时,InnoDB…

MySQL 事务

By | 6 5 月, 2021

概念

ACID:Atomicity(原子性)、Consistency(一致性)、Isolation(隔离性)、Durability(持久性)。

隔离级别

SQL 标准的事务隔离级别包括:读未提交(read uncommitted)、读提交(read committed)、可重复读(repeatable read)、串行化(serializable)

下面的表格从自己和他人的视角分别描述这四个隔离级别:

隔离级别 自己视角