mysql 存储引擎

83 阅读3分钟

索引

微信截图_20230210110813.png

索引结构

B+树 + 链表: 形成带有顺序指针的b+树,提高区间访问的性能,利于排序

索引分类

主键索引: 针对表中主键创建的索引, 默认自动创建,只有一个, primary

唯一索引: 避免同一个表中某数据列中的值重复, unique

常规索引: 快速定位特定数据

全文索引

在InnoDB存储引擎中,根据索引的存储形式,又可以分为以下两种

聚集索引: 将数据存储与索引放一块,索引结构的叶子节点保存了行数据, 必须有, 只有一个!!

聚集索引的产生:

  • 如果存在主键,主键索引就是聚集索引
  • 如果不存在主键,将使用第一个唯一(UNIQUE)索引作为聚集索引
  • 如果表没有主键或没有合适的唯一索引,则 InnoDB 会自动生成一个 rowid 作为隐藏的聚集索引

二级索引: 将数据与索引分开存储,索引结构的叶子节点关联的是对应的主键

回表查询 通过二级索引查询到id,再通过聚集索引查询到row数据行

索引语法

创建索引


create index 索引名 on 表名 (字段名, ...);

查看索引


show index from 表名;

删除索引


drop index 索引名 on 表名;

最左前缀法则

如果索引了多列(联合索引),要遵守最左前缀法则

范围查询-> 索引失效

索引列运算 -> 索引失效

字符串不加引号 -> 索引失效

模糊查询的头部模糊 -> 索引失效

or连接,其中一个条件没有索引 -> 索引失效

mysql 存储引擎

InnoDB

支持事务

支持行锁, 提高并发访问性能

支持外键约束

类型选择

日期时分秒 - datetime

年月日 - date

固定长度字段 - char

不固定 - varchar (varchar比char节省空间但速度不如char)

长文本字段 - text/longtext

图片等二进制数据 - blob/longblob

金额 - decimal

为什么不建议 select *

select * 不会使用到覆盖索引,不利于性能优化

sql优化

开启慢查询日志 建索引 优化查询中使用的表连接方式(内连接, 外连接, 自连接)

组合索引

最左前缀原则

数据库的隔离级别

事务的四大特性 asid

原子性 一致性 隔离性 持久性

数据概念

脏读: 脏数据是未提交的数据

不可重复读:一个事务先后读取同一条记录,读取中间数据被其他事务修改,则两次读取的数据不同

幻读: a事务先读取,b事务操作, a事务无法操作

事务的隔离级别

读未提交: (脏读)

读已提交: (不可重复读)

可重复读: (幻读) mysql默认隔离级别

串行化:

乐观锁:

悲观锁:

分库分表后,id主键如何处理

snowflake(雪花)算法

Mybatis

resultMap

自动填充关联对象

mybatis plus 怎么用join

maven 添加 mybatis plus join

主从复制

shareding-jdbc实现读写分离

多表join为什么查询慢?

笛卡尔积

解决: 反范式/内存查询

什么是反范式?

索引一定比不用快吗?

区分度

回表查询