文章目录
1. 隔离级别
数据库隔离级别,隔离级别从高到低:
- Serializable(串行化):事务串行执行。
- Repeatable-Read(可重复读):一个事务里对某个数据的查询结果都是一样的,不管其他事务是否修改了该数据。也就是解决了幻读和不可重复读的问题。
- Read Committed(读已提交):一个事务不会读到其他事务未提交的修改结果,也就是说如果其他事务提交,则就会读到提交的结果。
- 如果其他事务插入了数据,本事务读到了插入的数据,则为幻读;
- 如果其他事务修改了数据并提交,本事务读到了提交前后的数据,则为不可重复读。
- Read Uncommitted(读未提交):一个事务会读到其他事务未提交的修改结果,如果其他事务回滚,则会读到回滚前的结果。
2. SQL
- unique:每个表可以有多个unique约束,但是只能有一个primary key约束。被unique和primary key的字段都会作为mysql索引
- union: https://www.w3school.com.cn/sql/sql_union.asp
- in和exists的区别:in适合从表小,exists适合主表小
3. 分页
limit offset, N:扫描offset+N条数据,并把从offset开始的N条数据返回。连续分页查询的同时如果修改数据库,可能会产生查询数据丢失的情况,如下。可以通过增加修改时间戳来解决。
limit 0, 2(展示前2条) |
删除前2条数据的某一个 |
limit 2, 2(数据丢失) |
3.1 超大分页优化
log_tbl表特别大,service是非主键索引:
- Bad case: select * from log_tbl where service=“xxx” limit 1000000, 5,这里需要回表1000005数据,返回5条,查询很慢。
- Good case: select * from log_tbl as a join (select id from log_tbl where service=“xxx” limit 1000000, 5) as b where a.id = b.id; 这里只需要回表5条数据,大大缩短耗时。
4. 索引类型
4.1 聚簇索引和非聚簇索引
- 聚簇索引:索引数据和表数据放在一起存储。B+树的叶子节点存储数据,