mysql进阶
1.存储引擎
存储引擎就是存储数据,建立索引,跟新/查询等技术的实现方式,存储引擎是基于表的,而不是基于库的,所以存储引擎也可被称作表类型.
-- 查询建表语句 默认的存储引擎是InnoDB
show create table history
-- 创建表的时候指定存储引擎
create table tableName(
...
) engine = InnoDB(不指定的默认)
-- 查询当前数据库支持的存储引擎
show engines
1.存储引擎的特点
1.InnoDB
InnDB是一种兼顾高可靠性和高性能的通用存储引擎,在MYSQL5.5后 ,InnoDB默认是MYSQL的存储引擎.
特点
- DML(正删改语句)操作操作 遵循ACID(事务的四大特性)模型,支持事务
- 行级锁,提高并发访问性能
- 支持外键约束,保证数据的完整性和正确性
逻辑存储结构
- 表空间(TableSpace)
- 段(Segment)
- 区(Extent)(1M)
- 页(Page)(16k)
- 行(Row)
索引
1.优点:
提高数据库检索的效率,通过索引对数据进行排序,降低数据成本,降低 CPU的消耗
2.缺点:
索引列也要占用空间,索引大大提高了查询效率,但是却也降低更新表的速度.
3.索引的数据结构
MYSQL的索引实在存储引擎层实现的,不同的存储引擎有不同的结构
- b+tree索引:最常见的索引,只有精确度匹配索引列的查询才有效,不支持查询范围
- Hash索引:底层数据结构是用哈希表实现的,只有精确匹配索引列的查询才有效,不支持范围查询
- r_tree索引(空间索引)空间索引是 myisam引擎的一个特殊索引类型,主要用于清理空间数据类型,通常使用较少
- full_text(全文索引)是一种通过建立倒序排序索引,快速 匹配文档的方式
索引结构
二叉树
查询索引的时候可以对半查找,但是有可能成为单向链表查询性能会大大降低,大数据量情况下,层级较深,索引速度慢
红黑树
可以自平衡,但是 大量数据下层级越深,检索 速度慢
B-Tree
树的度数:值的是一个节点的子节点的个数,演变过程:达到最大度数-1中间节点向上分裂,
B+Tree
数据存放在叶子节点,叶子节点是一个链表,最后实现了单链表,非叶子节点起到索引的作用.
MYSQL对经典的B+Tree进行了优化.在原B+Tree的基础上,增加一个指向相邻叶子结点的的链表指针,形成了带有顺序的B+Tree
Hash索引
通过一定的hash算法,将键值换算成新的hash值,映射到对应的槽位上,然后存储在hash表中
特点:
- Hash索引只能用于对等比较(= ,in)不支持范围(between,<,>)
- 无法利用索引来完成排序工作
- 查询效率高,通常只需要一次检索就够了(不出现hash碰撞的情况下)
存储引擎支持:memory InnDB具有自适应hash索引
面试问题
为什么InnDB存储引擎选择使用B+Tree索引?
- 相对于二叉树,层级更少,搜索效率高
- 相对于b树无论是叶子节点还是非叶子节点,都会保存数据,导致一页中存储的键值减少,指针跟着减少,要保存大量数据,只能增加树的高度
选择使用B+Tree索引?
- 相对于二叉树,层级更少,搜索效率高
- 相对于b树无论是叶子节点还是非叶子节点,都会保存数据,导致一页中存储的键值减少,指针跟着减少,要保存大量数据,只能增加树的高度