解析:
索引用来快速地寻找那些具有特定值的记录。如果没有索引,一般来说执行查询时遍历整张
表。
索引的原理很简单,就是把无序的数据变成有序的查询:
1 把创建了索引的列的内容进行排序
2 对排序结果生成倒排表
3 在倒排表内容上拼上数据地址链
4 在查询的时候,先拿到倒排表内容,再取出数据地址链,从而拿到具体数据
解析:
适合索引的列是出现在 where 子句中的列,或者连接子句中指定的列。
基数较小的类,索引效果较差,没有必要在此列建立索引。
使用短索引。如果对长字符串列进行索引,应该指定一个前缀长度,这样能够节省大量索引
空间。
不要过度索引。索引需要额外的磁盘空间,并降低写操作的性能。
在修改表内容的时候,索引会进行更新甚至重构,索引列越多,这个时间就会越长。所以
只保持需要的索引有利于查询即可。
解析:
通常,通过索引查询数据比全表扫描要快。但是我们也必须注意到它的代价。
索引需要空间来存储,也需要定期维护, 每当有记录在表中增减或索引列被修改时,索引
本身也会被修改。
这意味着每条记录的 INSERT,DELETE,UPDATE将为此多付出 4,5 次的磁盘 I/O。
因为索引需要额外的存储空间和处理,那些不必要的索引反而会使查询反应时间变慢。
使用索引查询不一定能提高查询性能,索引范围查询(INDEX RANGE SCAN)适用于两种情况:
基于一个范围的检索,一般查询返回结果集小于表中记录数的 30%
基于非唯一性索引的检索
解析:
使用 B 树的好处:
B 树可以在内部节点同时存储键和值,因此,把频繁访问的数据放在靠近根节点的地方
将会大大提高热点数据的查询效率。
这种特性使得 B 树在特定数据重复多次查询的场景中更加高效。
使用 B+树的好处:
由于 B+树的内部节点只存放键,不存放值,因此,一次读取,可以在内存页中获取更
多的键,有利于更快地缩小查找范围。
B+树的叶节点由一条链相连,因此,当需要进行一次全数据遍历的时候,B+树只需要使用
O(logN)时间找到最小的一个节点,
然后通过链进行 O(N)的顺序遍历即可。而 B 树则需要对树的每一层进行遍历,这会需要更
多的内存置换次数,因此也就需要花费更多的时间
解析:
- B 树只适合随机检索,而 B+树同时支持随机检索和顺序检索;
- B+树空间利用率更高,可减少 I/O 次数,磁盘读写代价更低。一般来说,索引本身也很大,
不可能全部存储在内存中,因此索引往往以索引
文件的形式存储的磁盘上。这样的话,索引查找过程中就要产生磁盘 I/O 消耗。B+树的内
部结点并没有指向关键字具体信息的指针,只是作
为索引使用,其内部结点比 B 树小,盘块能容纳的结点中关键字数量更多,一次性读入内
存中可以查找的关键字也就越多,相对的,IO 读写
次数也就降低了。而 IO读写次数是影响索引检索效率的最大因素;
- B+树的查询效率更加稳定。B 树搜索有可能会在非叶子结点结束,越靠近根节点的记录查
找时间越短,只要找到关键字即可确定记录的存在,
其性能等价于在关键字全集内做一次二分查找。而在 B+树中,顺序检索比较明显,随机
检索时,任何关键字的查找都必须走一条从根节点到
叶节点的路,所有关键字的查找路径长度相同,导致每一个关键字的查询效率相当。
- B-树在提高了磁盘 IO 性能的同时并没有解决元素遍历的效率低下的问题。B+树的叶子节点
使用指针顺序连接在一起,只要遍历叶子节点就可
以实现整棵树的遍历。而且在数据库中基于范围的查询是非常频繁的,而 B 树不支持这样
的操作。
- 增删文件(节点)时,效率更高。因为 B+树的叶子节点包含所有关键字,并以有序的链
表结构存储,这样可很好提高增删效率。