不同类型的索引 -》 不同的数据结构 -》 Hash散列 ,二叉树,红黑树,B+Tree。
索引的 作用 : 快速检索数据
索引的 本质 : 数据结构
数据结构 包括 : 数组,链表,队列,树
数据结构的本质 : 就是为了更好的存储数据
Hash散列法 : 缺点:不能排序,会出现插入重复的冲突的问题,
优点:是时间复杂度O(1),精确查找非常快 。但是不能范围查询。
Hash散列法 的 查找过程:其实就是 查找的值 % 数组长度 ,得到的值就是在数组中的下标,可以直接找到对应的位置。
二叉树:缺点,会出现无法平衡的情况
红黑树: 相对平衡。 相对于 二叉树,相对平衡。但是还是会出现偏一侧的情况。
B+Tree : 不像二叉树,只能两个子节点,就要乡下增加层数。B+Tree优先横向存储,存不下了,再向下存储。
原理: 链表
Mysql 的 索引:
【引擎 : MYISAM,使用的是 非聚集索引】 [索引 和 表数据 分别存在不同的文件上]
底层:B+Tree
B+Tree的 高度是 恒定的 在3-5之间。不会像 红黑树一样高度随着数据量不断变大,不可控。
B+Tree 只有叶子节点可以存储数据。而 B Tree所有节点都可以存储数据。
索引 其实 就是以一个 字段 或几个字段 (比如ID,name) 为 key, 顺序排列,这样每一个 key (比如ID,name)都对应一个 寻址,这个寻址 指向对应的数据行,以便我们select的时候通过 key, 快速定位。
【引擎 : Innodb,使用的是 聚集索引 - > 以主键为索引 来组织数据的】
[索引 和 表数据 都 存在同一个文件里]
底层:也是 B+Tree
不再是通过 寻址去找对应的数据 ,是通过主键去寻找对应的数据。
概念:
索引实际上也是一张表,记录了主键和索引字段 ,一般以索引文件的形式存在磁盘上。
优势:
①.提高数据检索的速度,降低IO成本。通过缩小表中需要查询的记录的数目从而加快搜索的速度。
②。降低数据排序的成本,降低CPU消耗:索引之所以查的快,是因为先将数据排好序,若该字段需要排序,则正好降低了排序的成本。
缺点:
①.占用存储空间。索引实质也是一张表,所以在磁盘中多了一张表的数据。
②.降低更新数据的速度,更新数据的时候,不仅要更新原表,还要更新索引。
常见使用索引的情况 :
1)主键 做为 唯一索引
2). 经常用作查询条件的字段需要创建索引
3) 经常需要排序、分组和统计的字段需要建立索引
4) 查询中与其他表关联的字段,外键关系建立索引
5). 建立联合索引的情况下,根据最左前缀原则,把排序分组频率最高的列放在最左边,以此类推
不适合使用索引的情况:
1).表的记录太少了
2).经常增删改的表不要创建索引
3).区分度不高的不要使用索引,没多大效率。比如字段是boolean,只存true,false。
索引失效 :
1)。使用or会使得索引失效。除非几个字段都加了索引
2)。like 以 % 开头,都会失效 ,除非 这样写 : like 'sss%',不要以 %开头。
3)。如果字段的类型是 varchar ,条件是类型不一样比如 word > 1,用int类型,索引也失效。
4)。对 字段 用函数也会使得索引失效。
索引的优化 :
1). 在where 从句中,group by从句中,order by 从句中出现的列。
可以使用:force index(idx_order_levelDate)
比如要order by 两个索引字段,又想查所有的信息 ,使用force index() ,在查询 * ,也会使用索引,不会进行全表扫描
create index idx_order_levelDate on itdragon_order_list (order_level,input_date);
select * from itdragon_order_list force index(idx_order_levelDate) order by order_level,input_date;
2). 尽量少使用计算函数 如:【YEAR(),CURDATE()】
比如YEAR(create_time)>'2016' , 函数的计算会让索引失效,进行全表扫描。我们可以直接在业务上把值算好,传进来,而不是直接在数据库层面计算。
3).建立索引的列,不允许为 null ,用 Not null 约束该字段
4).需要用 join 的字段,保证字段加了索引
5).如果明确返回只有一条数据,用Limit 1