MySQL索引的底层数据结构是B+树数据结构
- B+树是一个多路平衡树,特点正如名字所示:“多路”:B+树的每个节点可以分出多条支路(支路数量上限取决于内存一页数据能存放多少个节点),“平衡”:树的各个分支深度都一样。
- B+树的所有叶子节点构成一个双向链表,便于进行范围查找。
- B+树中只有叶子节点存储数据(就是数据库中的记录),非叶子节点只有索引数据。
❗:B树 = = = B-树,称为多路搜索树,中间是连字符,不是减号。
为什么不用二叉查找树,而用“多路”查找树?
二叉树的特性造成根节点距离叶子节点的路径太长,增加了查找次数。
为什么B+树只留叶子节点存储数据呢?
这里涉及到计算机中的IO操作,计算机IO一次只能拿一数据页的数据,如果每一个节点都有数据,那么一次IO可供搜索的节点数会变得很少,IO操作是比较耗时的,因此一页内存存储多个节点可以有效提高搜索效率。
MySQL利用索引加快查找速度,那么索引数是不是越多越好?
建立索引就是给索引字段建立了一个索引结构(实际上,索引也是一张表,索引文件会额外占用磁盘空间),当插入一条数据时,那么这条数据中的被索引字段也需要建立到索引结构中,因此就需要调整索引结构。当索引数量较多时,数据更新会明显慢很多。
什么是索引和联合索引呢?
索引可以大大提高MySQL的检索速度,创建索引时,你需要确保该索引是应用在 SQL 查询语句的条件(一般作为 WHERE 子句的条件)。
对数据表的多个字段建立索引称为联合索引,建议索引字段最多不要越过3个,超过3个,应重新设计表。当两个字段单独查询返回行较多,同时查返回行较少,联合索引更高效。
# 建立单个索引
create index indexName on tableName (columnName)
# 建立联合索引
create index indexName on tableName(column1,column2,...,columnN)
如果建立的联合索引是A、B、C三个字段,查询条件是A、B,那么这个索引还有效果吗?
MySQL建立联合索引时会遵守最左前缀匹配原则,相当于根据查询条件精确匹配索引的左边连续一列或几列,则构建对应列的组合索引树,在检索数据时也从联合索引的最左边开始匹配。
例如:
create index indexName on tableName(a,b,c)
a,b 以及 a,b,c 均构成联合索引,但 b 或 b,c 不构成联合索引,a,b,c,d 同样不构成联合索引,因此需要哪个字段就查询哪个字段,避免出现未建立索引的字段。
索引在哪些类型的查询中会失效?
1、 不等号:在使用 !=
或者 <>
这样的会失效。
2、不包含、不存在:在使用 not in
、 not exists
这样的会失效。
3、null判断: is null
,不为空 is not null
这样的会失效。
4、不等号:在使用 <
、 >
、<=
、 >=
这些的时候,mysql优化器会根据索引比例、表的数据量大小等因素来决定走不走索引。