Mysql的复习
Mysql数据库的引擎
Mysq的引擎分为MyISAM和InnoDB
1. 如果要保证高性能的话,还是InnoDB更好。
2. MyISAM最大的却显示崩溃后无法安全恢复
3. InnoDB支持支持行级别锁,而MyISAM只能支持表级别的锁。
4. InnoDB支持事务,而MyISAM不支持事务。
5. InooDB支持MVCC,而MyISAM不支持
浅谈一下MVCC
MVCC是多版本并发控制。当有很多线程访问数据的时候,如果读的操作比写的操作多很多,那么还是严格加锁,那么并发程度就会很低。这个时候提出了一种MVCC多版本并发控制技术。简单来说利用类似快照的技术,不同的事务session只能看到自己这个版本的数据。
在Mysql中,只有读已提交和可重复度这两个隔离级别能够使用MVCC。串行化是严格加锁的,而读未提交每次访问到的都是最新的数据。
InnoDB的三种锁
- 记录锁(行锁)
- 间隙锁(假如有两条记录AB,间隙锁就是在AB之间加锁)
- 临键锁,锁定一个范围
Mysql的默认隔离级别
可重复读
Mysql索引详解
索引的定义:一种帮助数据库快速查询的数据结构,类似于目录。常见的索引结构有:哈希、B树、B+树。
- 使用索引的优点
- 查询速度大大提升
- 保证数据库数据的唯一性
- 使用索引的缺点
- 创建销毁需要开销
- 维护需要开销
- 索引本身也是一种数据结构,会导致占据的空间比较大
(数据量不大的情况下,使用索引不一定能带来查询效率的提升哦)
- Mysql使用的索引
- 为什么Mysql不使用Hash作为索引?
- 哈希冲突(不是主要原因)
- Hash索引不支持对数据排序,不支持范围查询。
这句话的执行,在Hash中是 0~499每一个都去Hash一遍,那这个速度相当慢。select * from user where id < 500
- Mysql为什么不使用B树(B-树)作为索引?
- B树的节点也是存数据的,不止有叶子结点存数据。其实每一次的查询相当于做一个二分查询,这导致查询速度的不稳定。(有的需要查到叶子结点,有的是中间结点)
- B树的叶子结点彼此独立,这对于范围查询并不有利。
- Mysql 为什么使用B+树作为索引。
- 只有叶子结点存放数据,因此查询速度十分稳定。
- 叶子结点有索引指向下一个叶子结点,适用于范围查询
- 为什么Mysql不使用Hash作为索引?
不同的索引类型
-
主键索引
-
二级索引
- 唯一索引,主要是保证数据的唯一性,其实并不能提升查询速度。
- 普通索引,就普通索引
- 前缀索引
- 全文索引,主要是在大文本中对于关键字的查询
-
聚集索引(InnoDB)
定义:索引结构和数据一起存放,所以查询速度极快(经典的就是主键索引)- 修改的代价比较大
- 插入也比较麻烦,担心这个索引是无序的,那Mysql底层是有有序的B+树,插入的时候就要对索引先排个序。
-
非聚集索引(MylSAM)
定义:索引和数据分开存放,先从数据库拿到索引,再根据索引去拿数据- 修改代价啥的都小很多
- 相对应速度慢了一点