zoukankan      html  css  js  c++  java
  • 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条件里用不到的字段

  • 相关阅读:
    MYSQL索引
    MYSQL 外键 on语句 多表查询
    MYSQL用户管理
    MYSQL数据类型 表基本操作 表记录增删改 单表查询
    JQuery 引用方式
    JQuery 元素操作 each循环
    Android EditText方框验证码 短信验证码攻略
    android MVP模式介绍与实战
    一些不错的Android开源音视频播放器
    Android可伸缩布局-FlexboxLayout(支持RecyclerView集成)
  • 原文地址:https://www.cnblogs.com/xilichenbokeyuan/p/15687544.html
Copyright © 2011-2022 走看看