一天一道面试题——数据库篇4(MySQL索引)

说一说MySQL索引。

索引定义

为了提高检索数据库的数据的数据结构。

索引分类

根据数据结构分类

B+树索引,哈希索引

根据列数(B+数索引)

单列索引和多列索引

根据数据的位置(B+数索引)

聚集缩影和非聚集缩影

B+树索引

B+树 VS 平衡二叉树

B+数作为平衡搜索树结构,具有查询效率高,层次低的优点,常用作索引。对比其他平衡二叉搜索树结构,层次低的B+数作为索引,可以减少对磁盘的访问次数,从而提高效率。

B+树 VS B树

  • B树的一个关键字只在一个节点,可以是叶子节点也可以不是。B+树的所有关键字都会出现在叶子节点中。
  • B+树的叶子节点相互连接,并且按照关键字排好序了,方便顺序访问(范围查找)数据库数据。
  • B+树的中间节点不保存数据,所有节点能存储更多元素,减少层次。
  • B+树都要查到叶子节点,查询稳定。

聚集索引 vs 非聚集索引

  • 聚集索引的叶子节点存储的就是数据库数据记录, 非聚集索引存储的是主键。
    非聚集索引和聚集索引的区别在于, 通过聚集索引可以查到需要查找的数据, 而通过非聚集索引可以查到记录对应的主键值 , 再使用主键的值通过聚集索引查找到需要的数据。
  • 聚集索引只有一个,非聚集索引可以有多个

覆盖索引查询

多列索引中数据已经包含了要查询的字段,不需要再用主键查询,就可以得到需要的数据。

优化器选择选择索引

原则

  • 在数据库里面,扫描行数是影响执行代价的因素之一。
  • 扫描的行数越少,意味着访问磁盘数据的次数越少,消耗的 CPU 资源越少。
  • 当然,扫描行数并不是唯一的判断标准,优化器还会结合是否使用临时表、是否排序等因素进行综合判断。

确定行数

  • 使用采样统计
  • 采样统计的时候,InnoDB 默认会选择 N 个数据页,统计这些页面上的不同值,得到一个平均值,然后乘以这个索引的页面数,就得到了这个索引的基数。
  • 而数据表是会持续更新的,索引统计信息也不会固定不变。所以,当变更的数据行数超过 1/M 的时候,会自动触发重新做一次索引统计。

索引失效

  • or语句前后没有同时使用索引。当or左右查询字段只有一个是索引,该索引失效,只有当or左右查询字段均为索引时,才会生效;
  • 复合索引未用左列字段,即不是使用第一列索引,索引失效;
  • like以%开头,当like前缀没有%,后缀有%时,索引有效;
  • 需要类型转换
    比如不加引号,在字符串列上查找
  • where中索引列有运算,或者索引列使用了函数;;
  • where中在索引字段上使用not,<>,!=。
    (不等于操作符是永远不会用到索引的,因此对它的处理只会产生全表扫描。key<>0 改为 key>0 or key<0。)不等于操作符是永远不会用到索引的,因此对它的处理只会产生全表扫描。优化方法:key<>0 改为 key>0 or key<0。)
  • 如果mysql觉得全表扫描更快时(数据少); 【优化器选择】
  • 在索引列上使用 IS NULL 或 IS NOT NULL操作。
    NULL不存在索引里面,所以IS NULL 不使用。如果在索引列上改条件为 Is Not Null ,因为索引列的所有非空值都存储在索引中,按道理也是可以走索引的。但是,为了解析查询语句,优化程序需要从索引中读取每一个值,在映射到表中索引返回的行。

没必要使用索引【不建议使用】

  • 唯一性差;
  • 频繁更新的字段不用(更新索引消耗);
  • where中不用的字段;
  • 如果where后含IS NULL /IS NOT NULL/ like ‘%输入符%’等条件,不建议使用索引
  • 索引使用<>时,效果一般;

索引提示

主动告诉MySql是否使用索引,指定使用说明索引。

  • use index:use index告诉MySql用列表中的其中一个索引去做本次查询
  • ignore index:ignore index告诉mysql不要使用某些索引去做本次查询
  • force index:force index和use index功能类似,都是告诉mySQL去使用某些索引

你可能感兴趣的:(一天一道面试题——数据库篇4(MySQL索引))