存储引擎
基于表的(创建表的时候)Innodb 默认--5.5 版本后,myISAM 早期默认,Memory
Innodb
*支持 DML , 事务 ,行锁 ,高并发,外键约束,保证数据完整和正确
*磁盘:每个表都有一个表空间文件(表结构 ,数据,索引)
逻辑存储结构:表--段--区(1M)--页(16K)--行
MYISAM(mongodb 替代)
*不支持事务,外键,行锁*支持表锁,*访问速度快
Memory(redis 替代)
索引
(二叉树: *优点:高速获取数据,提高排序效率 降低 cpu 消耗
缺点:占用磁盘,影响增删改
索引结构
B+tree 索支持所有引擎, hash 索引支持 memory
Btree:中间元素向上分裂 4ket 5 指针
B+tree:
*所有的元素都会出现在叶子节点*所有叶子都会形成一个单向链表
mysql 优化后的 B+tree
*增加一个指向相邻叶子节点的链表指针(双向),形成有序的指针提高访问
Hash(等值配匹-不能范围-不能排序)通常一次查询 很快
*将键值换算成 hash 值 映射到对应的槽位上,然后存在 hash 表中
*hash 冲突(碰撞)通过链表来解决
为什么 Innodb 选择使用 B+tree
*相对二叉树,层级更少,查询效率更高,*相对 Hash 不能范围-不能排序
*对于 Btree,无论是叶子还是非叶子节点都存储数据,这样导致一页中存储的键值和指针减
少,要保存同样的数据就加树高度,导致性能降低,有单向链表可以访问查询
B+树退化的极端情况是所有的数据都插入在最左边(或最右边)的叶子节点上,导致树的高
度增加,从而失去了 B+树的平衡特性。
索引分类:主键索引,唯一索引,常规索引,全文索引(查找文中的关键字)
innodb 索引的存储形式
1:聚集索引(必须有 且一个)(主键) 结构:(叶子节点挂的就是 row 数据)
2:二级索引 (多个)结构:(叶子节点挂的就是 id , (回表查询)
聚集索引选取规则
*优先主键 *第一个唯一索引 *自动生成一个隐藏的
Innodb 主键索引的 B+tree 高度为多高???!!!!!!!!!!!!!
表--段--区(1M)--页(16K)--行
*每个节点(包含 key,指针(6 字节))落在磁盘的页(16K)当中
*假设:一行数据大小为 1k ,一页可以存 16 行,指针占用 6byte, bigint 主键(key 值)
占用 8byte 高度为 2 第一层 n*8 +(n+1)*6 =16*1024 计算 n=1170 n 就是 ket 的数量第