索引在mysql中叫** “key” **
索引是对查询性能优化最有效的手段。
但是又常常被忽略
本章假设使用的是机械硬盘驱动器,对固态硬盘,索引的原则 依然成立,只是糟糕的索引影响没有对机械硬盘那么大
5.1 索引基础
联合索引 和 单列索引是完全不同的! 不管是创建 还是 查询
5.1.1 索引的类型
B-Tree 索引
所有的值都是按顺序存储的,且每个叶子页到根的距离相同。
因为B-TREE是按顺序存储,所以很适合查找范围数据。如按字母顺序查找 A ~ C 开头的值 。
联合索引
如
CREATE TABLE People(
...
key(last_name, first_name,dob)
);
可以看到, 先看 last_name 排序, 再看 first_name排,再再看生日排
使用的情况主要分下面几种:
除了按值查询,索引还可以用于 ORDER BY 操作
下面是一些 B-TREE 的索引的限制 :
要从最左列开始查, 不能不查第一个索引列,直接查第二个索引列,这时索引失效
不能跳过索引中的列,再到下一个列
到某个列的范围查询,则再往后面的索引就用不了了
到此可以策 索引的顺序是多么的重要!
在生产中可能需要内容相同, 但顺序不同的索引来满足不同类型的查询的需求
哈希索引
老版本只有Memory 引擎显式支持哈希索引,也是Memory引擎表的默认索引类型。
Memory 支持不唯一哈希索引。
哈希索引查询 分两步
- 获取hash值 ,取到对应的数据
- 再判断判断对应的值(非hash code)是不是要找的值
因为索引本身只存hash值, 所以索引的结构十分紧凑,这也让哈希索引查找的速度非常快。
但哈希索引也有他的限制:
无法用于排序
不支持部分索引
不支持大于小于 , 只支持 等于 不等于
当出现 哈希 冲突时(不同的索引列有相同的哈希值)要遍历链表中所有的行指针
哈希冲突很多的话,一些索引维护操作的代价也会很高
所以 hash索引只适用于某些特定的场合,但一旦适合, 性能 的提升就非常显著。
InnoDB 有一种自适应索引
人为的实际 hash 索引 :
人为加一列,来存hash值 , 然后设为索引 ,这时虽然是B-TREE,