归纳索引
2020-09-23 09:07:20 18 举报
AI智能生成
索引归纳
作者其他创作
大纲/内容
没有索引
在一个页中的查找
以主键为搜索条件
以非主键为搜索条件
从最小记录开始依次遍历单链表的每条记录
在很多页中查找
步骤
1. 定位到记录所在的页
2. 从所在的页内中查找相应的记录
缺点
因为不能定位所要查找的记录具体在哪一个页。所以只能从第一个页开始,找下去。
然后在每一个页中使用“在一个页中的查找" 的步骤
然后在每一个页中使用“在一个页中的查找" 的步骤
挑选索引
只为用于搜索、排序或分组的列创建索引
为列的基数大的列创建索引
列的基数大小,比如性别。那能过滤的记录就很少了。回表代价太高
索引列的类型尽量小
数据类型越小,在查询时进行的比较操作越快
数据类型越小,索引占用的存储空间就越少,在一个数据页内就可以放下更多的记录。从而减少IO带来的性能损耗。
也就意味着可以把更多的数据页缓存在内存中。
也就意味着可以把更多的数据页缓存在内存中。
索引字符串值的前缀
字符串值做索引的注意点
B+树索引中的记录需要把该列的完整字符串存储起来,而且字符串越长,在索引中占用的存储空间越大
如果B+树索引中索引列存储的字符串很长,那比较时间也会更多
可以只对字符串的前几个字符串做索引。
虽然不能精确记录的位置,但能定位到范围区间的左边界和右边界。
只要把这个区间的记录都取出来再进行内容比较就可以啦
只要把这个区间的记录都取出来再进行内容比较就可以啦
只有索引列在比较表达式中单独出现才可以使用索引
定位并删除表中的重复和冗余索引
尽量使用覆盖索引进行查询,避免回表带来的性能损耗
索引的使用
适合场景
1. 全值匹配
2. 匹配左边的列
3. 匹配列前缀
4. 匹配范围值
5. 精确匹配某一列并范围匹配另一列
6. 用于排序
不能使用索引排序的情况
ASC、DESC混用
WHERE子句中出现非排序使用到的索引列
排序列包含非同一个索引的列
排序列使用了复杂的表达式
7. 用于分组
特殊场景回表
普通索引先查到的是主键,如果不包含结果级,也会回表
覆盖索引
查询列表 是 用到的所有列的子集。那就不用回表啦
所以不要使用*号作为查询列表,要把我们需要查询的列标明。除了结果集大,也可能导致回表
索引的代价
空间上的代价
每建立一个索引都要为它建立一颗B+树,而我们知道一颗B+树对应两个段【叶子段,非叶子段】。
并且每个节点都是一个数据页,一个数据页默认会占用16KB的存储空间。
并且每个节点都是一个数据页,一个数据页默认会占用16KB的存储空间。
时间上的代价
每当对数据进行增删改操作时,都需要维护索引树。
如果建了很多索引,则每个索引对应的B+树都要进行维护。
如果建了很多索引,则每个索引对应的B+树都要进行维护。
0 条评论
下一页