mysql索引
1.mysql的三大范式
- 范式1,保证了数据不可再分
- 范式2,在范式1的基础上,非主键列完全依赖与主键,而不是依赖一部分,保证了数据唯一性
- 范式3,在范式2的基础上,非主键只依赖于主键,而不依赖与其他非主键
2.mysql存储引擎myisam和InnoDB的区别
- InnoDB提供了ACID支持事物,并提供行锁和外键的约束
- myisam不提供事物也不提供行锁和外键限制
- memory所有数据存储在内存中,输出处理速度快,但是性能不高
3.InnoDB和myisam索引的区别
- InnoDB是聚簇索引,myisam是非聚簇索引
- InnoDB的主键索引上叶子节点存在对应行数据,所以主键索引效率非常高
- myisam存储是的行地址,需要在进行回表查询,才能获取所需要的行索引
4.索引优缺点:
- 优点1提升查询效率
- 优点2优化项目性能
- 缺点1创建和维护耗时就
- 缺点2索引占用物理空间
5.索引的数据结构
索引的数据结果是hash和B树
- hash索引的话低层是hash表,插入时没有顺序,不能进行范围查询比如查询>1&<10的这种范围,同时索引不能进行排序,但是hash查询单条数据的时候最快,因为hash的叶子节点存在的是key,如果是别的话就比较慢了,hash索引有时会需要回表查询,因为hash叶子节点存储的是key,需要回表查询这条key的行数据BTree的话存储的是key+行数据
- BTree是有顺序的查询,可以进行范围查询,同时也支持排序,它的叶子节点存储的是key和行数据
6.索引的算法:hash算法和bTree算法
- BTree是mysql默认的算法,不仅可以在等,大于,大于等于,小于,小于等于,和区间这些操作上也可以用作like查询,只要查询条件开头不是通配符开头的常亮都可以
- hash算法,只能用于对等比较,比如等于,相当于(<=>)这两个操作符,但是它不像BTree索引需要从根节点到直接点,最后才能访问到叶节点这样多次IO访问,所以检索效率比BTREE高
7.创建索引的原则
- 最左匹配原则,从左到右一次执行
- 查询比较频繁的字段创建索引(where次数多的字段)
- 更新频繁的字段不要建立索引
- 不能区分行和列的不要作为索引列,(比如,性别,男女其他,最多只有三种情况)
- 尽量扩展索引,不要新增索引,会消耗物理内存
- text,image这些数据类型不要建立索引
- 重复值比较多的不要建立索引
8.创建索引表的注意事项
- 非空字段
- 取值离散大的字段
- 索引字段越小越好
9.BTree和B+Tree的区别
- 在BTree中,键和值都存放在内部节点和叶子节点上,但是B+Tree中,内部节点都是键,叶子节点同时也放得键和值
- B+Tree的叶子节点有条链相连,而BTREE则各自独立链接
10.BTREE和B+TREE的好处
- B树可以再内部节点同时存键和值因此把频繁访问的数据放在靠近根节点的地方会提升查询效率,特定在数据多次重复查询的场景中更加高效
- B+树内部节点只存放键不放值,因此一次读取可以再内存页中多获取更多的键,有利于更快的缩小查询范围,当需要进行一次全数据遍历的时候B+树只需要时间找到最小节点,然后通过O的顺序进行遍历就好,而B树的话需要对每一层进行遍历,会需要更多的内存置换次数,需要花费更多时间
11.hash索引和B+树索引的区别和优劣
- hash低层是hash表,进行查询的时候调用一次可以获取到相应的KEY,然后回表获取实际数据,B+树实现低层是多路平衡查找树
- hash索引在进行等值查询的时候速度更快,但是无法进行范围查询,因为hash索引经过hash函数建立索引后,索引顺序与原顺序无法保持一致,不能支持范围查询,而B+树遵循最左节点小于父节点,父节点小于右节点天然支持范围查询
- hash索引不支持使用索引进行排序,原理同上
- hash索引不支持模糊查询以及组合索引(最左匹配)
- hash索引避免不了回表查询,而B+树可以直接获取到正行数据
- hash索引索然等值比较快,但是不稳定,当key大量重复的时候只能hash碰撞
12什么是聚簇索引什么是非聚簇索引
- 聚簇索引:将数据存储与索引放到了一块,找到了索引也找到了数据
- 非聚簇索引:key与数据分开,索引中的叶子节点是存的数据的对应行,需要回表进行查询
13事物的ACID
- 原子性,保证数据不可分割
- 一致性,事物执行前后,数据保持一致
- 隔离性。并发访问数据库的时候一个用户的事物不被其他事物所干扰,各并发各事
- 持久性。一个事物被提交后,对数据库的更改是持久的,即使数据库发生问题也不应该受到影响