文章目录
1:MySQL 索引的数据结构有那些
- B 树
- B + 树
- hash 索引
2:MySQL的存储引擎有哪些
show engines;
- innoDB -B +
- MyISAM - B+
- MEMORY - hash
3:InnoDB 是否支持hash
- 支持自适应的hash
- 索引是系统自动帮我们创建的
- 用户是没办法干预的
- InnoDB
- emp.frm 存储的数据的结构
- emp.ibd 存储的实际数据文件 {真实数据文件+ 索引}
- MyISAM
- emp.frm 存储的数据结构
- emp.MYD mydata,实际的数据
- emp.MYI myindex,实际的索引
4:扰动函数
- 16 个位置 ,实际上只需要了最后的四位
- 所以我们要让高位向右移动,散列的更加均匀一些
5:hash表的索引结构
- hash需要将所有的数据文件添加到内存中,比较消耗内存空间
- 如果所有的查询都是等值查询,那么hash确定很快,但是实际工作中用的更多的是范围查询,而不是等值查询,因此,这种hash就不太合适了
- MEMORY存储引擎使用
- 占内存,我不怕
- hash算法比较麻烦,我是用一个比较通用的算法
- 保证尽可能的都是等值查询
6:二叉树,红黑树的索引结构
- 树的深度过深,而造成 I/O 的次数变多,影响数据的读取效率
- AVL 树和 红黑树基本是在基于内存情况才会使用的数据结构
- InnoDB 默认一次取得是 16K 的数据
- 减少 I/O 的次数
- 减少 I/O 的大小
- mysql 中有一个服务层,每次从存储引擎中把数据取出来,在服务层进行筛选之后,返回客户端
10:最左匹配
- 回表
- 使用二级索引,或者是辅助索引的时候
- 先查 name字段的B +树,得到ID 之后
- 再查 主键的 B+ 树
- 索引覆盖
- select * from table where name = ‘jiang’ 需要回表
- select id from table where name = ‘jiang’ 不需要回表
- 最左匹配
- 在组合索引的时候使用,例如name 和 age 建立联合索引
- 1 2 4 走索引
-
优化器
- CBO
- RBO
12:MRR
- mult_rang read
- 给了一千个ID ,我们可以先进行排序,这样我们就可以进行范围的查询
- 加快速度,不必要一个一个的进行查询
13:FIC
- fast index create
- 插入和删除数据
- 先创建临时的表格,把数据导入到临时表
- 把原始表删除
- 修改临时表的名字
- 给当前添加一个Share锁,不会有创建临时文件的消耗,但是在操作源文件的时候,如果此时有人发起DML操作,就会造成数据的不一致现象。所以读写是没有问题的,但是在DML还是有问题