深入MySQL(三):MySQL的索引的应用

在MySQL的优化中,索引的作用绝对算是一个大头,很多时候索引使用得当可以使得一个查询的效率提高几个数量级,同时它还具有自动排序等功能。所以如果是深入MySQL,那么索引绝对是其中重要的一部分。

MySQL中的索引按类型分大致可以分为5类:

  • 主键索引
  • 普通索引
  • 唯一索引
  • 文本索引
  • 组合索引

主键索引

定义:唯一且不为空,简称主键,表中可以没有主键,但是最多只能有一个;
在Innodb中,会默认将主键索引设置为聚簇索引;
一般而言,主键索引的建立符合以下的原则:

用户量较小的情况下,一般用自增序列即可满足条件,但是在一些情况下,主键的选择就不只是简单的自增属性了,后续会专门出一篇博客重新讲述分布式唯一ID的生成算法。

普通索引(NORMAL)

定义:设置单个字段作为索引,没有任何限制,是我们使用最多的索引;
普通索引的查询,在innodb中其是非聚簇索引,索引它存在一个回表的过程,所以后期有个优化便是使用覆盖索引;

唯一索引(UNIQUE)

定义:设置单个字段作为索引,并且该索引不会重复,可以为null;
主要是对该索引字段进行唯一性限制。

组合索引

定义:设置多个字段作为索引;
将多个字段作为一个索引,索引选取的字段的顺序很重要,遵循最左匹配原则。

以上是按照索引的使用类型来划分的;
按底层数据结构分可以分为2类:

  • B-Tree索引
  • hash索引

Innodb中默认使用的便是B-Tree索引,其底层数据结构是B+树,对以下类型的查询有效:

但是B-Tree索引也有缺点:

大家可以看到,B-Tree索引的很多运用场景都与最左匹配原则有关,所以大家写查询的时候一定记住思考最左匹配原则,同时通过EXPLAIN来查看语句的执行计划来优化索引;

Hash索引的特点:

Hash索引的话,只适用于某些特定的场合。

按照经验来说,其实我们使用WHERE的字段,就可以建立索引;但是作为技术人员,我们应该严谨的研究什么时候添加索引。我们这里暂时都只对B-Tree索引进行讨论,先来看B-Tree索引带来的好处:

独立的列

独立的列主要代表两个方面:

其实我觉得很好理解,因为以上的两种情况,都要对列进行计算,相当于就不是原来的列了,所以就无法使用索引;

使用前缀索引

我们都知道,现实中是存在例如邮箱等的具有相同后缀的数据的,所以我们肯定指定使用其前缀索引来减小和加快索引的查找,但是会降低选择性;
选择性是 不重复的列 / 总数据列数的值,最好为1,我们可以使用COUNT()函数来计算其选择性,来选取与原来的选择性相差不大的情况;

使用覆盖索引避免回表

我们知道,如果在一个字段上面建立一个索引,那么索引的节点其实是存储了 值,主键的,获取主键之后,再需要去主键所在的B+树进行查找,才能查找到具体数据。
而如果使用了覆盖索引,例如我们建立一个组合索引”email,phone”,当我们利用WHERE email = ‘843497509@qq.com’查找phone的时候,其实我们已经获取了phone的数据,所以MySQL不会进行回表操作,而是直接返回结果集。

利用索引进行排序

MySQL的排序是一个很麻烦很复杂很耗性能的一个过程,甚至会进行大量的磁盘IO,所以如果某一个字段需要经常性的排序,在B+树中,会自动根据B+树的节点值进行排序,所以我们就会省略这个字段的排序过程。

Original: https://www.cnblogs.com/hyx-hasaki/p/15820152.html
Author: Huangzzzzz
Title: 深入MySQL(三):MySQL的索引的应用

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

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

(0)

大家都在看

  • Oracle 序列学习与使用总结

    by:授客 QQ:1033553122 序列是oracle提供的用于生成一系列数字的数据库对象,序列会自动生成顺序递增的序列号,可用于提供唯一的自动递增主键。序列和视图一样,并不占…

    Java 2023年6月16日
    064
  • 普通java项目打jar包运行以及 jar包中class文件替换

    目录 1、普通java项目打jar包运行1.1、新建一个java项目,必须有main方法,sys的打印目录重定向到到外部文件1.2、把项目到出成jar,如果Launch confi…

    Java 2023年5月29日
    068
  • Jenkins构建vue项目自动部署到远程服务器

    1.环境要求 以下服务器的操作系统均为Centos7 服务器A:Gitlab 服务器B:Jenkins 服务器C:Nginx,即你的vue项目部署服务器。 gitlab、Jenki…

    Java 2023年6月5日
    085
  • AOP spring boot 使用AOP面向切面编程

    关于AOP AOP(Aspect-OrientedProgramming,面向方面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充…

    Java 2023年6月5日
    083
  • 快速上手Mybatis项目

    1、搭建实验数据库 CREATE DATABASE mybatis; USE mybatis; DROP TABLE IF EXISTS user; CREATE TABLE us…

    Java 2023年6月15日
    075
  • 小数点的几种精确方法

    小数点的几种精确方法 1.直接用格式化输出String.format() double b=123.4; System.out.println(String.format(&quo…

    Java 2023年6月5日
    077
  • ThreadLocal 线程变量副本

    强引用:常常 new 出来的对象就是强引用类型,只要强引用存在,垃圾回收器将永远不会回收被引用的对象,哪怕内存不足的时候 软引用:使用 SoftReference 修饰的对象被称为…

    Java 2023年6月5日
    086
  • jdk8函数式接口——Consumer介绍

    Consumer介绍与实例分析函数式接口:@FunctionalInterfaceConsumer(消费者)函数式接口:@FunctionalInterface自从jdk8提供了函…

    Java 2023年5月30日
    072
  • 数组

    数组介绍: 可以存放同一类型的数据,包括基本数据类型和引用类型 *数组也是一种数据类型,引用类型 数组的声明和创建: 动态初始化创建–> 数据类型[] 数组名 =…

    Java 2023年6月16日
    061
  • SpringMVC快速上手

    SpringMVC开发简介 SpringMVC开发步骤 导入SpringMVC相关依赖 porm.xml: <dependency> <groupid>or…

    Java 2023年6月5日
    079
  • Day4-笔记(自增自减运算符、逻辑运算符、位运算、三元运算符、包机制)

    自增自减运算符 public static void main(String[] args) { // 自增++ , 自减– 一元运算符 int a = 1; int temp …

    Java 2023年6月6日
    084
  • mysql sql语法

    show index from 表名; 查询某一张表的索引 explain select * from 表名 where 条件; 使用explain查看查询优化器对索引的使用情况 …

    Java 2023年6月5日
    087
  • Java开发笔记(一百四十三)FXML布局的基本格式

    前面介绍了JavaFX的常见控件用法,虽然JavaFX控件比起AWT与Swing要好用些,但是一样通过代码编写控件界面,并没有提高什么开发效率。要想浏览界面的展示效果,都必须运行测…

    Java 2023年6月6日
    080
  • Redis 安装与使用

    NoSQL 1. 定义 NoSQL(Not Only SQL)即不仅仅是 SQL,泛指非关系型的数据库 2. 为什么使用 NoSQL? 传统关系数据库在应付动态网站、特别是超大规模…

    Java 2023年6月8日
    086
  • Java(8)数组

    数组 数组存储相同类型值的序列。 声明数组 数组是一种数据结构,用来存储同一类型值的集合。通过一个整型下标(index,或称索引)可以访问数组中的每一个值。例如,如果a是一个整型数…

    Java 2023年6月9日
    079
  • Java 快速开发几 MB 独立 EXE,写图形界面很方便

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

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