索引数据结构
索引:帮助mysql高效获取数据的排好序的数据结构
数据机构:
二叉树
红黑树(平衡二叉树)树的高度不可控
hash表。不能做排序
- B-Tree
- 叶子点具有相同的深度,叶子点的指针为空
- 所有索引元素不重复
- 节点中的数据索引从左到右递增排序
注意:数据高度不可控数据查找没有指针
- B+Tree(高度可控)节点从左到右一次递增(排好序)
- 非叶子节点不存储data,只有存储索引(冗余),可以放更多的索引
- 叶子节点包含所有索引字段
- 叶子节点用指针连接,提高区间访问的性能
注意:查找数据时会把节点load到内存去做对比(二分查找法)最后在到磁盘里进行查找
mysql对叶子节点设置为16kb节点可以放多少个索引用bigint来举例8bit+下个文件磁盘地址c语言底层为6个bit16kb/8+6b=1170个元素。三个节点叶子节点一行1kb 大概放16个元素为2000多万元素
- hash
- 对索引的key进行一次hash计算就可以定位出数据存储的位置
- 很对时候hash索引要比B+树索引更高效
- 仅能满足"=","IN",不支持范围查询
- hash冲突
M
myIsam存储引擎实现
- 索引文件和数据文件是分离的(非聚集)
- 对应三个文件(.frm)表结构,(.myd)数据 , (.myi)索引
注意:先查索引再去查数据
InnoDB存储引擎索引实现
- .ibd数据和索引
- InnoDB索引实现聚焦
- 表数据文件本身就会是按B+Tree组织的一个索引结构文件
- 聚簇索引叶子节点包含了完整的数据记录
为什么建议InnoDB表必须建主键,并且推荐使用整型的自增主键?
- 如果没有建主键那么会根据字段的列如果没有重 复就会以这个列为主键比如列name不重复,如果所有字段列都有重复;自己会在数据库内部建立一个隐藏主键比较耗资源'所以一般建议设立主键、推荐整形的自增是因为innodb中数据是排好序的,这样效率更高更快
联合索引的底层存储结构长什么样子?
- 联合索引的底层存储跟单列索引类似的,区别在于联合索引是每个树节点中包含多个索引值,在通过索引查找记录时会先将联合索引中第一个索引列节点中第一个索引值进行匹配,然后匹配第二个索引列和索引值,直到联合索引列都匹配完,如果第一个不匹配直接跳过前往下一个节点。如果两个索引只查询后一个索引做查询条件会导致索引失效
-
索引的最左前缀原理是指在一个复合索引中,索引按照定义时的顺序形成了一个索引键前缀列表,查询时只能使用索引键的最左边的连续部分来进行索引搜索。
具体来说,假设我们有一个复合索引包含多个列,例如 (col1, col2, col3),那么根据最左前缀原理:
- 当查询条件只包含索引的最左边的列(col1)时,可以使用该索引进行搜索,这将提供最佳的索引性能。
- 当查询条件包含索引的最左边的连续多个列(例如 col1 和 col2,或 col1、col2 和 col3)时,同样可以使用该索引进行搜索。
- 当查询条件不包含索引的最左边的列,即查询条件只涉及索引的非最左前缀列(比如只使用了 col2 或者 col3)时,无法使用该复合索引进行搜索。在这种情况下,数据库引擎可能会选择不使用索引或使用其他辅助索引(如果有的话),或者执行全表扫描来满足查询。
-
需要注意的是最左前缀原理只适用于复合索引,而不适用于单列索引。它的存在是为了保证索引的顺序性和查询的有效性。