mysql基础面试
mysql基础
1 索引
帮助数据库实现高效获取数据的数据结构
创建索引:
1 把区别度高的作为索引
2 遵循最左前缀匹配原则
3 只用做条件的列建索引,不然会拖慢插入效率
常见的mysql数据结构一般是两种:Hash和b + tree索引,Innodb用的是 b + tree
b + tree
和Hash
有什么区别?
Hash底层是哈希表,哈希表是一种以key-value存储的数据结构,所以是无序的
1 对于区间查询要全局扫面,比较适合等值的查询场景
2 不能按照索引排序
3 如果有大量重复键值,效率会很低,因为会发生键值对碰撞问题
4 不支持多列联合索引的最左匹配规则
b + tree 是一种多路平衡查询树,叶子节点是有序的,左子节点 < 父节点,父节点 < 右子节点,所以范围查询时,不需要做全表扫描
- b + tree的叶子节点可以存什么?有什么区别?聚簇索引和非聚簇索引?
可以存整行数据,也可能是主键的值
叶子节点中存整行数据的是主键索引,也称之为聚簇索引
叶子节点中存索引的值是普通索引,也称之为非聚簇索引
聚簇索引查询效率更高,因为叶子节点中直接是要查询的数据;
而非聚簇索引,叶子节点中查到的是索引的值,我们要按照索引的值,再查一次;
覆盖索引时,不用回表
- 联合索引
把经常作为where 条件的字段设置索引
联合索引时,把识别度高的放在前边,因为mysql索引查询遵循最左前缀匹配原则:最左优先,在检索数据时从索引的最左端开始匹配。(k1, k2, k3)
索引,相当于k1, (k1, k2), (k1, k2, k3)三个索引
2 事物
- 事物的基本要素
1 原子性:事物开始,要么做完,要么不做,中间出问题会回滚
2 一致性:事物从开始到结束,数据的完整性约束没别破坏。a向b转账,a减钱,b不能不加钱
3 隔离型:同一时间只能有一个事物请求同一条数据
4 持久性:事物结束,保存到数据库的数据不能回滚
- 事物的隔离级别
1 读未提交:未提交的数据会被读,如果回滚,脏读
2 读已提交:提交的数据才会读,但是会造成重复读结果不一样,不能重复读,Oracle默认隔离级别就是这个
3 可重复读:事物没结束,写入的数据,不会被读,重复的读,结果是一样的。mysql默认是这个
4 序列化(串行化):上边3个没解决幻读的问题,一个事物新增一条数据的过程中,另一个事物新增了一条数据,然后第一个事物新增不上