MYSQL

本文深入探讨了MySQL数据库的隔离级别、SQL操作、分页优化,特别是超大分页的解决方案。详细阐述了不同类型的索引,包括聚簇和非聚簇索引,以及回表查询和索引覆盖。此外,还讲解了MySQL的锁机制,如行级锁、表级锁、意向锁,以及间隙锁、Next-Key Lock在可重复读隔离级别的应用。文章还涉及了查询优化、分布式事务处理,并推荐了相关资源链接。
摘要由CSDN通过智能技术生成

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+树的叶子节点存储数据,
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值