索引

不同类型的索引 -》 不同的数据结构 -》 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

你可能感兴趣的:(索引)