1、什么是索引?
索引是帮助MySQL高效获取数据的数据结构(有序)。
在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。
图示:
索引本身也很大,一般以索引文件的形式存在磁盘上。
2、说一下索引有哪些优势有哪些劣势?
优势:
1、提高数据的查询效率,降低了数据库的IO成本;
2、通过索引列对数据进行排序,可以大大降低排序的成本,即降低了CPU的消耗。
劣势:
1、实际上索引也是一张表,该表中保存了主键和索引字段,并指向实体表的记录,所以索引列也是要占用空间的;
2、虽然索引大大提高了查询效率,但同时也降低了更新表的速度,如对表进行insert,update,delete。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。每次更新或添加了索引列的字段,都会调整因为更新所带来的键值变化后的索引信息。
3、介绍一下索引的数据结构?
索引是在MySQL的引擎层中实现的,所以每种存储引擎的索引都不一定完全相同,也不是所有的存储引擎都支持所有的索引类型。
MySQL目前提供了以下四种结构的索引:
1、BTREE索引:最常见的索引类型,大部分索引都支持B树索引。
2、HASH索引(了解):只有Memory引擎支持,适用场景简单。
3、R-TREE索引(了解):即空间索引,是MyISAM引擎的一个特殊索引类型,主要用于地理空间数据类型。
4、Full-text索引(了解):即全文索引,也是MyISAM引擎的一个特殊索引类型,主要用于全文检索,InnoDB从MySQL5.6开始支持全文检索。
我们平常所说的索引,如果没有特别指明,都指的是B+树索引。其中InnoDB引擎,默认使用的就是B+树结构的索引。
4、BTREE索引的检索原理
初始化简介:
一颗B+树,浅蓝色的块我们称之为一个磁盘块,每个磁盘块包含几个数据项(深蓝色)和指针(黄色);
如:磁盘块1包含数据项17和35,包含指针P1,P2,P3;
P1表示小于17的磁盘块,P2表示在17和35之间的磁盘块,P3表示大于35的磁盘块;
真实的数据只存在于叶子节点,即:3、5、9、10、13、15、28、29、36、60、75、79、90、99;
非叶子节点不存储真实的数据,只存储指引搜索方向的数据项,如:17、35并不真实存在于数据表中。
查找过程:
如果要查找数据项29,那么首先会把磁盘块1由磁盘加载到内存,此时发生一次IO,在内存中用二分查找确定29在17和35之间,锁定磁盘块1的P2指针;
通过磁盘块1的P2指针的磁盘地址把磁盘块3由磁盘加载到内存,发生第二次IO,29在26和30之间,锁定磁盘块3的P2指针;
通过磁盘块3的P2指针的磁盘地址把磁盘块8由磁盘加载到内存,发生第三次IO,同时内存中做二分查找找到29,结束查询,共计3次IO。
总结:
真实的情况是,3层的B+树可以表示上百万的数据,如果上百万的数据查找只需要3次IO,性能提高将是巨大的;
如果没有索引,每个数据项都要发生一次IO,那么总共需要百万次的IO,成本非常高。
5、索引分为哪些类型?
单值索引:即一个索引只包含单个列,一个表可以有多个单列索引。
唯一索引:索引列的值必须唯一,但允许有空值。
复合索引:即一个索引包含多个列。
6、索引的基本语法?
1、创建索引:
方式1:
create [UNIQUE] index 索引名 on 表名(字段名...);
示例:create [UNIQUE] index idx_city_name on city(city_name);
方式2:
alter table 表名 add index 索引名(字段名...)
示例:alter table city add index idx_city_name(city_name);
2、查看索引:
show index from 表名;
示例:show index from city;
3、删除索引:
drop index 索引名 on 表名;
示例:drop index idx_city_name on city;
7、哪些情况需要创建索引?
1、主键自动建立唯一索引
2、频繁作为查询条件的字段应创建索引
3、查询中与其它表关联的字段,外键关系建立索引
4、查询中排序的字段,排序字段若通过索引去访问将大大提高排序速度
5、查询中统计或分组字段
8、哪些情况不需要创建索引?
1、数据量太少
2、经常做增删改频繁操作的的字段
3、数据重复且分布平均的表字段
解释:假如一个表有10万记录,有一个字段只有true和false两种值,且每个值的分布概率大约为50%,那么这个对该字段建索引不会提高查询效率;
索引的选择性:索引列中不同的值的数目/表记录数
如果一个表中有2000条数据,索引列有1980个不同的值,那么这个索引的选择性就是1980/2000=0.99,选择性越接近1,索引的效率越高。
4、where条件里用不到的字段
来源:https://www.cnblogs.com/xilichenbokeyuan/p/15687544.html
图文来源于网络,如有侵权请联系删除。