Mysql索引总结

一、索引分类

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

二、主键索引

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

  • 索引页 + 数据页组成的B+树就是聚簇索引。
  • InnoDB聚簇索引:

  • 聚集索引叶节点存储整行数据(即数据页)

    [En]

    the clustered index leaf node stores the whole row of data (that is, data pages)*

  • 普通索引叶子节点:

三、回表与索引覆盖

  • 只有索引字段的值保存在非聚集索引(普通索引)中。联邦索引先按第一列排序,然后按第二列排序。仍然排序,然后按主键索引排序)和主键索引值。
    [En]

    only the values of the index fields are saved in the non-clustered index (normal index). The federated index is sorted by the first column and then by the second column. Sort, all the same, and then sort by primary key index) and the value of the primary key index.*

  • 回表:Select的where条件中是非聚簇索引,查询需要返回非聚簇索引中不包含的字段,此时需要用主键索引再查一次聚簇索引;
  • 索引覆盖率:创建要查询到联合索引中的字段。这种查询不需要返回表。
    [En]

    Index coverage: create the fields to be queried into the federated index. This kind of query does not need to return to the table.*

四、联合索引

  • 联合索引中多列条件为OR关联时,索引不生效;
  • 最左列必须在查询条件下,否则不生效–最左匹配原则
    [En]

    the leftmost column must be in the query condition, otherwise it will not take effect-leftmost matching principle*

  • 在联合索引范围查询中,第一列是范围查询,后续的列范围查询不能索引。只有当第一列是等价查询时,后续列才可以使用范围查询。
    [En]

    in a joint index range query, the first column is a range query, and the subsequent column range query cannot be indexed. Only when the first column is an equivalent query, the subsequent column can use the range query.*

  • groupBy+索引,效率特别高,不需要建中间表,也不需要排序;

五、索引优化技巧

  • 大字段建索引时,可以只取字段的前半部分,例: CREATE INDEX table ON dual(address(20));
  • 当值高于列中的列时,查询优化器将放弃索引并扫描整个表。默认情况下,比例分隔线为30%。
    [En]

    when a value is higher than the column in a column, the query optimizer will abandon the index and scan the full table. The scale dividing line is 30% by default.*

  • orderBy和groupBy后的字段最好建索引,不会产生中间表;
  • 隐式类型(”1″=> 1)转换会导致索引失效;
  • 深分页查询时使用Limit时,先嵌套子查询,把id查出来,再通过id用where条件搜索,可以避免回表;

Original: https://www.cnblogs.com/zhusihua/p/14980341.html
Author: 拉通对齐端到端
Title: Mysql索引总结

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/507912/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • [Mysql]null与真值

    SQL的逻辑运算使用的是三值逻辑,逻辑表达式的计算结果有三种可能, true, false, unknown 比较运算的表达式含 NULL时会产生 unknown结果,例如 SEL…

    数据库 2023年6月16日
    085
  • BFS与DFS套路总结

    概述 深度优先遍历和广度优先搜索和广度优先搜索是解决图问题最常见的方式,并且在leetcode中有许多相关的变体,但万变不离其宗,其本质结构或者算法框架时固定的,因此本文BFS和D…

    数据库 2023年6月11日
    0110
  • Java基础六—Java集合框架Map

    HashMap HashMap使用hash数组+单链表实现,数组中的每个元素都是链表,由Node内部类实现,当链表长度超过8时,转化为红黑树。 HashMap实现了Map接口,即允…

    数据库 2023年6月6日
    078
  • 深入汇编指令理解Java关键字volatile

    volatile是什么 volatile关键字是Java提供的一种轻量级同步机制。它能够保证可见性和有序性,但是不能保证原子性 可见性 对于volatile的可见性,先看看这段代码…

    数据库 2023年6月16日
    081
  • Python–反射

    反射是一个很重要的概念,它可以把字符串映射到实例的变量或者实例的方法然后可以去执行调用、修改等操作。它有四个重要的方法: 1、getattr 获取指定字符串名称的对象属性 2、se…

    数据库 2023年6月9日
    083
  • PHP最全编码规约

    1.1 标签 (1)【强制】PHP 程序可以使用或来界定 PHP 代码,在 HTML 页面中嵌入纯变量时,可以使用这样的形式,不可使用其他的标签变种。 正例: (2)【强制】纯 P…

    数据库 2023年6月14日
    0115
  • springboot使用Redis,监听Redis键过期的事件设置与使用代码

    我使用的是Windows下的Redis服务,所以一下Redis设置都是在Windows平台进行。 1、修改Redis配置文件 1.1:Windows下的Redis存在两个配置文件 …

    数据库 2023年6月16日
    093
  • 设计模式之七大原则

    1.单一职责原则: 不要存在多于一个导致类变更的原因。通俗的说,即一个类只负责一项职责 使用一个列子来表达,一个动物类,动物可以使用里面的方法进行奔跑: //单一职责原则测试 pu…

    数据库 2023年6月6日
    0108
  • 异常详解

    🦔异常 发现错误的理想时机是在编译阶段,也就是在运行程序之前。然而编译期间并不能找到所有的错误,余下的问题必须在运行期间解决。这就需要错误源能够通过某种方式,把适当的信息传递给某个…

    数据库 2023年6月14日
    092
  • MongoDB的CRUD操作(入门)

    MongoDB的简单介绍: 1:MongoDB是什么? mongodb是非关系数据库 但是是非关系数据库当中功能最丰富,最像关系数据库的 MongoDB是一个基于分布式文件存储的数…

    数据库 2023年6月6日
    0121
  • Mysql查询优化

    mysq查询l优化 指标:执行时间 检查的行数 返回的行数 explain关键字 — 实际SQL,查找用户名为Jefabc的员工 select * from emp where …

    数据库 2023年5月24日
    0119
  • POI操作EXCEL对象

    POI操作EXCEL对象HSSF:操作Excel 97(.xls)格式XSSF:操作Excel 2007 OOXML (.xlsx)格式,操作EXCEL内存占用高于HSSFSXSS…

    数据库 2023年6月16日
    084
  • linux学习之联网问题解决

    (centos7)linux隔日重启后发现无法联网解决方案 1.运行命令 ip addr 查看 ip地址 2.运行命令 vi /etc/sysconfig/network-scri…

    数据库 2023年6月16日
    093
  • windows环境下nacos集群启动报错-无法启动内嵌的tomcat

    解决办法:使用64位jdk切记不要使用32位。切记不要使用32位。切记不要使用32位。 Original: https://www.cnblogs.com/journeyhch/p…

    数据库 2023年6月11日
    085
  • 计算字符串中连续出现最多的字符串和长度

    public static void main(String[] args) { // 定义的字符&#x4E3…

    数据库 2023年6月11日
    095
  • python logging模块详解

    日志 日志是跟踪软件运行时所发生的事件的一种方法。软件开发者在代码中调用日志函数,表明发生了特定的事件。事件由描述性消息描述,该描述性消息可以可选地包含可变数据(即,对于事件的每次…

    数据库 2023年6月11日
    099
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球