索引
索引结构
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为什么查询慢?
笛卡尔积
解决: 反范式/内存查询
什么是反范式?
索引一定比不用快吗?
区分度
回表查询