1、索引分类

  1. Hash索引
    Hash 索引查询效率很高,时间复杂度O(1)。Mysql Innodb引擎不支持hash索引的。Hash索引适合精确查找,不适合范围查找。
  2. 平衡二叉树
    时间复杂度为 O(n),根节点会变,数据量多,层次多,磁盘IO多。
  3. B树
    每个节点中不仅包含数据的 key 值,还有 data 值。数据量较大的时候,同样会导致B树很深,从而增加了磁盘 IO 的次数。
  4. B+树
    所有的数据节点都在最后一层上,叶子节点按关键字排序,从左到右指针连接,层级更少,查询稳定。

2、主键索引

搜索过程:索引页 ——> 索引页 ——> 数据页

索引页+数据页组成的B+树就是聚簇索引

InnoDB聚簇索引

  1. 如果定义了PK,那么PK就是聚簇索引
  2. 没有PK,第一个not null unique就是聚簇索引
  3. 否则,自动建一个隐藏列作为聚簇索引

聚簇索引叶子节点储存整行数据(就是数据页);

普通索引叶子节点:

  1. InnoDB储存主键索引
  2. MyIsam储存行记录的指针

3、回表与索引覆盖

非聚簇索引(普通索引)中只保存了索引字段的值(按照顺序排列,联合索引先按第一列排序,再按第二列……排序,全都相同,再按主键索引排序)与主键索引的值


回表:

Select的where条件中是非聚簇索引,查询需要返回非聚簇索引中不包含的字段,此时需要用主键索引再查一次表

索引覆盖:

被查询的字段,建立到联合索引里去。

4、联合索引与最左匹配

  • 多列条件为OR关联时,不生效
  • 最左匹配最左边的列必须在查询条件中,不然不生效;
  • 联合索引范围查询时,第一列是范围查询后续的列再范围查询没法走索引的,只有第一列等值查询时,后续的列才能用范围查询
  • groupBy+索引,效率特别高,不需要建中间表,也不需要排序;

5、索引优化

  • 大字段建索引时,可以只取字段的前半部分
    CREATE INDEX table ON dual(address(20));
  • 某个值在某一列中出现比列很高时,查询优化器就会放弃索引,全表扫;比例分界线默认是30%
  • orderBygroupBy后的字段最好建索引,不会产生中间表
  • 隐式类型(“1”=> 1)转换会导致索引失效
  • 大数据查询分页使用Limit时,先嵌套子查询把id查出来,再通过id用where条件搜索,可以走索引,避免回表

面试系列——Mysql索引的更多相关文章

  1. php面试专题---Mysql索引类型、介绍及优点

    php面试专题---Mysql索引类型.介绍及优点 一.总结 一句话总结: 精品视频讲解里面的资料来源也是通过各种资料,比如博客.书等,只不过是基于讲解者的知识体系有整理的过程 1.B-Tree索引三 ...

  2. php面试专题---Mysql索引原理及SQL优化

    php面试专题---Mysql索引原理及SQL优化 一.总结 一句话总结: 注意:只写精品 1.为表设置索引要付出代价 是什么? 存储空间:一是增加了数据库的存储空间 修改插入变动索引时间:二是在插入 ...

  3. .NET面试题解析(00)-开篇来谈谈面试 & 系列文章索引

    系列文章索引: .NET面试题解析(01)-值类型与引用类型 .NET面试题解析(02)-拆箱与装箱 .NET面试题解析(03)-string与字符操作 .NET面试题解析(04)-类型.方法与继承 ...

  4. 阿里面试:MySQL如何设计索引更高效?

    有情怀,有干货,微信搜索[三太子敖丙]关注这个不一样的程序员. 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试完整考点.资料以及我的系列文章. ...

  5. 我以为我对Mysql索引很了解,直到我遇到了阿里的面试官

    GitHub 4.8k Star 的Java工程师成神之路 ,不来了解一下吗? GitHub 4.8k Star 的Java工程师成神之路 ,真的不来了解一下吗? GitHub 4.8k Star 的 ...

  6. Mysql高手系列 - 第22篇:深入理解mysql索引原理,连载中

    Mysql系列的目标是:通过这个系列从入门到全面掌握一个高级开发所需要的全部技能. 欢迎大家加我微信itsoku一起交流java.算法.数据库相关技术. 这是Mysql系列第22篇. 背景 使用mys ...

  7. 深入浅出Mysql索引优化专题分享|面试怪圈

    文章纲要 该文章结合18张手绘图例,21个SQL经典案例.近10000字,将Mysql索引优化经验予以总结,你可以根据纲要来决定是否继续阅读,完成这篇文章大概需要25-30分钟,相信你的坚持是不负时光 ...

  8. 数据库系列:MySQL索引优化总结(综合版)

    1 背景 作为一个常年在一线带组的Owner以及老面试官,我们面试的目标基本都是一线的开发人员.从服务端这个技术栈出发,问题的范围主要还是围绕开发语言(Java.Go)等核心知识点.数据库技术.缓存技 ...

  9. 面试突击60:什么情况会导致 MySQL 索引失效?

    为了验证 MySQL 中哪些情况下会导致索引失效,我们可以借助 explain 执行计划来分析索引失效的具体场景. explain 使用如下,只需要在查询的 SQL 前面添加上 explain 关键字 ...

随机推荐

  1. [刷题] 24 Swap Nodes in Paris

    要求 给定一个链表,对于每两个相邻的节点,交换其位置 示例 1->2->3->4->NULL 2->1->4->3->NULL 实现 1 struct ...

  2. QTableWidget - 基础讲解(1)

    转载:http://www.cnblogs.com/fuqia/p/8904196.html QTableWidget是QT程序中常用的显示数据表格的空间,很类似于VC.C#中的DataGrid.说到 ...

  3. Chm文件阅读软件测试需求

    转发: .Chm文件阅读软件测试需求 . xchm问题太多就不考虑了: kchm是问题少一些 windows打开是乱码就不去考虑 必须在windows打开正常的再在龙芯上打开 1windows打开是乱 ...

  4. Sed常用功能个人整理

    Sed常用功能个人整理 AsdilFibrizo关注 2019.06.24 10:23:41字数 240阅读 15 Sed对1G以下的数据效率很高这里介绍一些个人在工作中遇到的sed问题 1.查找字段 ...

  5. IT菜鸟之虚拟机VMware的使用

    虚拟机安装完成了,以下是虚拟机的使用. 双击快捷方式,打开vmware虚拟机. 点击创建新虚拟机,这里可以选择创建方式,可以点击典型并一路下一步创建,我们这里讲自定义创建. 这里选择兼容版本,大家可以 ...

  6. IT菜鸟之虚拟机VMware的安装

    老师说过,如果想学好Linux,最好不要在实体机上安装Linux,因为学习需要经常折腾,在实体机上做实验,出现故障就要重新安装,这样绝大多数时间都会浪费在安装上. 这时我们需要一个工具,它就是虚拟机. ...

  7. Linux shell脚本全面学习(一)

    1. Linux 脚本编写基础 1.1 语法基本介绍 1.1.1 开头 程序必须以下面的行开始(必须方在文件的第一行): #!/bin/sh 符号#!用来告诉系统它后面的参数是用来执行该文件的程序.在 ...

  8. Ubuntu 16.04安装PyCharm

    PyCharm一个是Python集成开发环境,它既提供收费的专业版,也提供免费的社区版本.PyCharm带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,比如调试.语法高亮.Proj ...

  9. MySQL中InnoDB存储引擎的实现和运行原理

    InnoDB 存储引擎作为我们最常用到的存储引擎之一,充分熟悉它的的实现和运行原理,有助于我们更好地创建和维护数据库表. InnoDB 体系架构 InnoDB 主要包括了: 内存池.后台线程以及存储文 ...

  10. ADAS超声波雷达

    ADAS超声波雷达 在倒车入库,慢慢挪动车子的过程中,在驾驶室内能听到"滴滴滴"的声音,这些声音就是根据超声波雷达的检测距离给司机的反馈信息. 倒车雷达系统,英文全称为REVERS ...