MySQL索引(一)

一、索引概念

索引是一种提升SQL查询速度的数据存储结构,数据源于定义索引时指定的字段列。

索引类似于目录,人们能根据目录快速定位到书的某一页,MySQL也是通过索引快速定位对应的数据列。

如果没有索引,MySQL在查询某表id=90的数据时,就必须从第一行开始,遍历全表来找相应的行,时间成本太大,没人会用的。

二、索引类型

(一)业务逻辑分类

MySQL索引(一)

如图为Navicat建立时显示的索引类型,基本符合逻辑分类。

1、NORMAL – 普通索引

普通索引限制没有那么多,允许在定义索引的列中插入重复值和空值。

底层数据结构为B-树。

create index idx_name on user(name); -- 为name字段建立名为"idx_name"的普通索引

2、UNIQUE – 唯一索引

与普通索引相比,唯一索引不允许数据出现重复,但允许出现空值。

底层数据结构为B-树。

create unique index u_image on user(image); -- 为image字段建立名为"u_image"的唯一索引

3、PRIMARY KEY – 主键索引

专门为主键字段建立的索引,不允许重复值或者值为空。

底层数据结构为B-树。

一般在建表的时候声明主键,会自动创建主键索引。

CREATE TABLE user (
  id bigint(20) NOT NULL AUTO_INCREMENT,
  name varchar(255) DEFAULT NULL
  PRIMARY KEY (id) -- 声明id为主键
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4;

4、FULLTEXT – 全文索引

全文索引主要用来查找文本中的关键字,只能在 CHARVARCHARTEXT 类型的列上创建。在 MySQL 中只有 MyISAM 存储引擎支持全文索引。全文索引允许在索引列中插入重复值和空值。不过对于大容量的数据表,生成全文索引非常消耗时间和硬盘空间。

底层数据结构为B-树。

create fulltext index full_content on user(content); -- 为content字段建立名为"full_content"的唯一索引

5、SPATIAL – 空间索引 (不常用)

空间索引是对空间数据类型的字段建立的索引,使用 SPATIAL 关键字进行扩展。

创建空间索引的列必须将其声明为 NOT NULL空间索引只能在存储引擎为 MyISAM 的表中创建。空间索引主要用于地理空间数据类型 GEOMETRY.

create spatial index spa_line on user(line); -- 为line字段建立名为"spa_line"的空间索引

(二)索引字段个数不同分类

1、单列索引

单列索引就是索引只包含原表的一个列。在表中的单个字段上创建索引,单列索引只根据该字段进行索引。

单列索引可以是普通索引,也可以是唯一性索引,还可以是全文索引。只要保证该索引只对应一个字段即可。

如下为针对name字段的索引。

create index idx_name on user(name); -- 为name字段建立名为"idx_name"的普通索引

2、多列索引

组合索引也称为复合索引或多列索引。相对于单列索引来说,组合索引是将原表的多个列共同组成一个索引。多列索引是在表的多个字段上创建一个索引。该索引指向创建时对应的多个字段,可以通过这几个字段进行查询。但是,只有查询条件中使用了这些字段中第一个字段时,索引才会被使用。

如下为name、age、image字段建立名为”idx_name_age_image”的普通多列索引。

create index idx_name_age_image ON user(name,age,image);

为什么有了单列索引,还需要多列索引?

最左前缀原则

(name,age,image) 一个多列索引时,其实相当于建立了 (name)(name,age)(name,age,image) 三个索引。

多个查询条件均建立索引的情况下,查询效率也会快不少,因此我们在创建复合索引时应该将最常用作限制条件的列放在最左边,依次递减。

三、索引使用

(一)如何判断sql使用了索引?

使用explain关键字。

参考:Explain关键字解析

(二)如何使用索引?

1、where 索引字段

explain select * from user where name = 'a'; -- name是需要加索引的字段,放在where后,就能使用索引

MySQL索引(一)

2、order by 索引字段

explain select * from user where age > 10 order by id; -- 对id加了索引,排序时直接使用索引排序

MySQL索引(一)

(三)如何避免索引失效?

1、不要在列上进行运算

select * from users where YEAR(adddate)

可以改成:

select * from users where adddate

2、不要使用not in 或 !=、 <>

NOT IN和<>操作都不会使用索引将进行全表扫描。NOT IN可以NOT EXISTS代替,id<>3则可使用id>3 or id

Original: https://www.cnblogs.com/ZJJCodeLife-520/p/16463540.html
Author: 桃子来了
Title: MySQL索引(一)

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

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

(0)

大家都在看

  • 面试现场!月薪3w+的这些数据挖掘SQL面试题你都掌握了吗? ⛵

    💡 作者:韩信子@ShowMeAI📘 数据分析实战系列:https://www.showmeai.tech/tutorials/40📘 AI 面试题库系列:https://www….

    数据库 2023年6月14日
    0115
  • zabbix监控配置项配置

    1.手动添加监控项 2. 使用模板添加监控项 3.0 邮件告警 创建主机并加入主机组 1.手动添加监控项 即获取数据的监控指标增加用户,修改用户,删除用户etc/passwd文件都…

    数据库 2023年6月14日
    0118
  • springboot~Cache注解缓存在代码中的获取

    对于springboot中基于方法的缓存Caching来说,我们直接以声明的方式添加,删除这些缓存,而它们在redis这种持久化产品中,通过 value::key的方法组成一个re…

    数据库 2023年6月6日
    0131
  • Spring Boot + MyBatis 多模块项目搭建教程

    一、前言 1、开发工具及系统环境 * – IDE:IntelliJ IDEA 2020.2.2 – 系统环境:Windows 2、项目目录结构 * &#82…

    数据库 2023年6月6日
    0126
  • MySQL学习笔记-day01

    SQL,全称 Structured Query Language, SQL用来和数据库打交道,完成和数据库的通信, SQL是一套标准。(90%以上的 SQL都是通用的)。 SQL:…

    数据库 2023年5月24日
    0108
  • MySQL45讲之备库并行复制策略

    前言 本文主要介绍 MySQL 备库的并行复制策略。 为什么备库需要并行复制 如果主数据库有大量的更新操作,因为主数据库可以并发写入,而从数据库只能在单个线程中执行,那么从数据库的…

    数据库 2023年5月24日
    0108
  • @JsonFormat和@DateTimeFormat的作用

    @DatetimeFormat是将String转换成Date,一般前台给后台传值时用 import org.springframework.format.annotation.Da…

    数据库 2023年6月14日
    0107
  • 如何把 MySQL 备份验证性能提升 10 倍

    JuiceFS 非常适合用来做 MySQL 物理备份,具体使用参考我们的官方文档。最近有个客户在测试时反馈,备份验证的数据准备( xtrabackup –prepare)过程非常…

    数据库 2023年5月24日
    0104
  • IPFS 集群部署

    IPFS 和 IPFS-Cluster 默认的端⼝:IPFS: 4001 – 与其他节点通信端⼝ 5001 – API server 8080 – Gateway server I…

    数据库 2023年6月9日
    0113
  • Spring AOP

    AOP简介: 面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。 *作用:在不惊动原始设计的基础上为其进行功能增强。 AOP核心概念 (1)Aspec…

    数据库 2023年6月16日
    0117
  • Python学习笔记(十一)– Django API RESTful

    (1)路由;(2)视图类(提供给用户访问相当于原来的视图函数);(3)序列化类(提供给视图类使用,把对象序列化成Json) 注意:使用rest_framework,需先 setti…

    数据库 2023年6月16日
    0104
  • Digester解析xml原理

    Tomcat内部是使用Digester来解析xml文件的,将xml转化为java对象。 digester底层是基于SAX+事件驱动+栈的方式来搭建实现的,SAX主要用来解析xml,…

    数据库 2023年6月16日
    090
  • SQL Server 2022来了

    SQL Server 2022来了 微软SQL Server依然保持着3年内发布一个大版本的传统,最新版本已经来到SQL Server2022 相关特性双向HA/DR 到Azure…

    数据库 2023年6月9日
    0129
  • eclipse安装反编译插件

    一、下载插件 1、官方地址:http://jd.benow.ca/ 2、百度网盘:http://pan.baidu.com/s/1eSJ7Tiq 密码:sr6p 二、打开eclip…

    数据库 2023年6月9日
    0134
  • MySQL中读页缓冲区buffer pool

    Buffer pool 我们都知道我们读取页面是需要将其从磁盘中读到内存中,然后等待CPU对数据进行处理。我们直到从磁盘中读取数据到内存的过程是十分慢的,所以我们读取的页面需要将其…

    数据库 2023年5月24日
    0129
  • Maven进行clean时报错,解决方法

    Q1:由于网络原因,maven仓库中产生了后缀LastUpdated文件,再次clean直接报错 参考方法:https://www.cnblogs.com/DDgougou/p/1…

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