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