索引是一种排好序的数据结构,帮mysql高效获取数据
索引数据结构:
二叉树
红黑树
Hash表
B-Tree

如果没有索引,他就会扫描整个表。有索引,会根据索引的那一列,找到我们要找的那一行数据。

mysql底层的数据结构是B+树

b+树
因为b+树的行高只有3,可以减少磁盘io的次数,有效提高查找的效率
叶子节点之间是双向链表,支持范围查询

innodb引擎

数据直接存在了叶子节点,这样可以添加上面两行的宽度,存储更多的数据

innodb引擎

myisam引擎

叶子节点存储得是数据得地址
myisam索引文件和数据文件是分离的(非聚集)

myisam引擎

hash得索引存储结构,不支持范围查询

对索引得key进行一次hash计算就可以定位出数据存储得位置
很多时候Hash索引要比B+树索引更高效
仅能满足“=”,“in”,不支持范围查询
hash冲突问题

hash冲突问题

联合索引,最左前缀原则

从左到右,先比较第一个字段,如果前面得属性一样 ,就比较后面,直到比较得字段不一样,explain分析sql语句

(explain)

事务的隔离级别

mysql中事务的隔离级别一共四种:
读未提交(read uncommitted)
读已提交(read committed)
可重复读(repeatable read)默认
序列化   (serializable)
读未提交(read uncommitted)
提供了事务之间最小限度的隔离。
处于这个隔离级别的事务可以读到其他事务还没有提交的数据。
读已提交(read committed)
处于这个隔离级别的事务可以看到其他事务 对数据的修改。
在一个事务内,能看到别的事务提交的数据
可重复读(repeatable read)默认
处于这个级别的事务不被看成是一个序列。
别的事务提交的数据看不到。
序列化 (serializable)
如果隔离级别为序列化,则用户之间通过一个接一个顺序的执行当前事务,这种隔离级别提供了事务之间最大限度的隔离。

脏读、幻读、不可重复读

事务的隔离性上,从低到高可能产生的读现象分别是:脏读、不可重复读、幻读
  • 脏读指读到了别的事务未提交的数据 不可
  • 重复读指一次事务内的多次相同查询,读取到了不同的结果
  • 幻读是不可重复读的特殊场景。一次事务内的多次范围查询得到了不同的结果。

通过在写的时候加锁,可以解决脏读。
通过在读的时候加锁,可以解决不可重复读。
通过串行化,可以解决幻读。

索引、锁

索引,锁

  1. 索引可以加快数据库的检索速度
    表经常进行INSERT/UPDATE/DELETE操作就不要建立索引了,换言之:索引会降低插入、删除、修改等维护任务的速度。
    索引需要占物理和数据空间。
    了解过索引的最左匹配原则知道索引的分类:聚集索引和非聚集索引
    Mysql支持Hash索引和B+树索引两种

2.从锁的粒度,我们可以分成两大类:

表锁
开销小,加锁快;不会出现死锁;锁定力度大,发生锁冲突概率高,并发度最低

行锁
开销大,加锁慢;会出现死锁;锁定粒度小,发生锁冲突的概率低,并发度高

不同的存储引擎支持的锁粒度是不一样的:
InnoDB行锁和表锁都支持!
MyISAM只支持表锁!

MVCC工作原理

mvcc实现原理
mvcc多版本并发控制。
mvcc在mysql innodb中主要是为了提高数据库并发性能,用更好的方式去处理读写冲突,做到即使有读写冲突时,也能做到不加索,非阻塞并发读。

实现原理:
mvcc的实现是通过保存数据在某个时间点的快照来实现的。也就是说不管需要执行多长时间,每个事物看到的数据都是一致的。

sql优化

sql优化