百木园-与人分享,
就是让自己快乐。

MySQL索引详解,面试必问

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
图文来源于网络,如有侵权请联系删除。

未经允许不得转载:百木园 » MySQL索引详解,面试必问

相关推荐

  • 暂无文章