好文推荐:
【数据库】快速理解脏读、不可重复读、幻读-CSDN博客
再探幻读!什么是幻读?为什么会产生幻读,MySQL中是怎么解决幻读的?-CSDN博客
引擎
mysql默认引擎:innodb
1.支持行锁
2.支持事务
3.支持外键
索引
索引之b+tree和b-tree
b+tree:数据都在叶子结点,叶子节点通过链表连在一起
为什么使用b+树:
1.相比于二叉树,高度大大减小,每一层高度意味着io读写,性能大大降低
2.相比于b树,因为非叶子节点只存储索引,每一页可以存更多的索引,降低高度
3.可范围查询
从上一节中的B-Tree结构图中可以看到每个节点中不仅包含数据的key值
,还有data值
。而每一个页的存储空间是有限的,如果data数据较大时将会导致每个节点(即一个页)能存储的key的数量很小,当存储的数据量很大时同样会导致B-Tree的深度较大,增大查询时的磁盘I/O次数,进而影响查询效率。在B+Tree中,所有数据记录节点都是按照键值大小顺序存放在同一层的叶子节点上,而非叶子节点上只存储key值信息
,这样可以大大加大每个节点存储的key值数量,降低B+Tree的高度。
聚集索引:索引和数据存在一起,叶子节点存的是该行数据
二级索引:索引和数据分开存储,叶子节点存储的是主键
select * from where name = "Anc",需要现在二级索引的b+shu找到其主键,然后在聚集索引找到该id下的该行数据,称为回表查询
建立(username,password)联合索引,这样覆盖索引,不用回表查询
尽量使用联合索引,而不是单列索引,因为联合索引很多时候可以覆盖索引,不用回表查询
锁
MyISAM 仅仅支持表级锁(table-level locking),一锁就锁整张表,这在并发写的情况下性非常差。InnoDB 不光支持表级锁(table-level locking),还支持行级锁(row-level locking),默认为行级锁。
行级锁的粒度更小,仅对相关的记录上锁即可(对一行或者多行记录加锁),所以对于并发写入操作来说, InnoDB 的性能更高。
表级锁:对整张表进行加锁,并发下效率极低,myisam和innodb都支持
行级锁:
MySQL 中锁定粒度最小的一种锁,是 针对索引字段加的锁 ,只针对当每行数据进行加锁。 其加锁粒度最小,并发度高,但加锁的开销也最大,加锁慢,会出现死锁。