MySQL是一个关系型数据库,它采用表的形式来存储数据。你可以理解成是Excel表格,既然是表的形式存储数据,就有表结构(行和列)。行代表每一行数据,列代表该行中的每个值。列上的值是有数据类型的,比如:整数、字符串、日期等等。
在设计数据库结构的时候,要尽量遵守三范式,如果不遵守,必须有足够的理由。比如性能。事实上我们经常会为了性能而妥协数据库的设计。
优点:
缺点:
由于数据是存储在磁盘上的,查询数据时,如果没有索引,会加载所有的数据到内存,依次进行检索,读取磁盘次数较多。有了索引,就不需要加载所有数据,因为B+树的高度一般在2-4层,最多只需要读取2-4次磁盘,查询速度大大提升。
哈希索引:哈希索引是基于哈希表实现的,对于每一行数据,存储引擎会对索引列进行哈希计算得到哈希码,并且哈希算法要尽量保证不同的列值计算出的哈希码值是不同的,将哈希码的值作为哈希表的key值,将指向数据行的指针作为哈希表的value值。这样查找一个数据的时间复杂度就是O(1),一般多用于精确查找 B 树索引:B 树的特点就是节点同时保存 key 和 数据,B 树在找到具体的数值以后就结束,查询复杂度不稳定,最好为 O(1),数据就在第一层(所以 B 树适合把热点数据存在上层,适用于缓存) B+ 树索引:B+ 树的特点是非叶子节点只保存 key,而叶子节点保存 key 和 数据
哈希索引
B 树索引
B+ 树索引
主键索引
唯一索引
组合索引
全文索引
普通索引
最左前缀原则
最左匹配原则
聚集索引是按照数据在磁盘上的物理顺序来组织数据的,其叶子节点保存着完整的数据行信息
辅助索引也称为 非聚集索引、二级索引
MySQL可以使用多个字段同时建立一个索引,叫做联合索引。在联合索引中,如果想要命中索引,需要按照建立索引时的字段顺序挨个使用,否则无法命中索引。
覆盖索引的目的就是避免发生回表查询,通过覆盖索引,只需要扫描一次 B+ 树即可获得所需的行记录,也就是说当前查询语句所要求的字段全部命中了二级索引中所保存的索引字段。
使用前缀索引可能会导致两个问题:
可以看到,有了索引下推的优化,在满足一定的条件下,存储引擎层会在回表查询之前对数据进行过滤,可以减少存储引擎回表查询的次数。
事务其实就是封装的一组操作,要么都执行,要么都不执行
事务的特性ACID:原子性、一致性、隔离性、持久性。
原子性
一致性
持久性
不可重复读主要涉及到修改数据,而幻读则主要涉及到插入或删除数据。 解决方案不同:不可重复读的解决方案通常是使用行锁或者表锁来解决,而幻读的解决方案通常是使用间隙锁来解决。
Serializable (串行化)
Repeatable read (可重复读)
Read committed (读已提交)
Read uncommitted (读未提交)
查看隔离级别
设置隔离级别
生产环境大多使用RC(读已提交)。为什么不是RR(可重复读)呢? 读已提交(Read Commited),简称为RC , 可重复读(Repeatable Read),简称为RR
生产环境大多使用RC(读已提交)。为什么不是RR(可重复读)呢?
简称为RC
简称为RR
也就是说,RC的并发性高于RR。并且大部分场景下,不可重复读问题是可以接受的。毕竟数据都已经提交了,读出来本身就没有太大问题!
按锁粒度分类,有行级锁、表级锁和页级锁
行级锁是mysql中锁定粒度最细的一种锁
表级锁是mysql中锁定粒度最大的一种锁
页级锁是 MySQL 中锁定粒度介于行级锁和表级锁中间的一种锁
按锁级别分类,有共享锁、排他锁和意向锁。
共享锁又称读锁,是读取操作创建的锁。
排他锁又称写锁、独占锁,如果事务T对数据A加上排他锁后,则其他事务不能再对A加任何类型的封锁。
InnoDB 中的两个表锁
意向共享锁(IS)
意向排他锁(IX)
常见的解决死锁的方法
MVCC 就是同一份数据保留多版本的一种方式,进而实现并发控制。在查询的时候,通过read view和版本链找到对应版本的数据。 作用:提升并发性能。对于高并发场景,MVCC比行级锁开销更小。
快照读
当前读
避免全表扫描
索引
避免使用*号
避免在 where 子句中对字段进行 is null 值判断
where 子句中使用 or 来连接条件
in 和 not in 也要慎用
对于低性能的SQL语句的定位,最重要也是最有效的方法就是使用执行计划,MySQL提供了explain命令来查看语句的执行计划。对于查询语句,最重要的优化方式就是使用索引。 而执行计划,就是显示数据库引擎对于SQL语句的执行的详细情况,其中包含了是否使用索引,使用什么索引,使用的索引的相关信息等。 通过type 访问类型可以看到有没有走索引
最重要也是最有效的方法就是使用执行计划
通过type 访问类型可以看到有没有走索引
建立索引
利用缓存
读写分离
限定数据的范围
冷热数据分离
分库分表
垂直拆分
垂直拆分的原则
水平拆分
用于记录执行时间超过某个临界值的SQL日志,用于快速定位慢查询,为我们的优化做参考。
先用操作系统命令 top 命令
看看里面跑的 session 情况
找出消耗高的 sql
kill 掉这些线程
有大量的 session 连进来导致 cpu 飙升
垂直分库
水平分库
垂直分表
水平分表