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)

大家都在看

  • MySQL45讲之前缀索引

    本文介绍了字符串前缀索引的优缺点,以及当字符串的区分度不高时如何建立索引。 [En] This article introduces the advantages and disa…

    数据库 2023年5月24日
    092
  • 第十六章 Spring动态代理详解

    MethodInterceptor(方法拦截器) public class Arround implements MethodInterceptor { /* invoke方法: …

    数据库 2023年6月14日
    094
  • 用SkyWalking监控MySQL(一)工具与方案

    本文适用于SkyWalking v9.1.0。 SkyWalking简介 SkyWalking是一个分布式系统的应用程序性能监视(APM)工具,专为微服务、云原生架构和基于容器(K…

    数据库 2023年5月24日
    0129
  • Java集合详解

    Java集合 集合体系 Collection接口 Collection接口没有直接的实现子类,它的子接口list(有序容器,可以重复)和set(无序容器,不可重复)是两个重要的子接…

    数据库 2023年6月16日
    0111
  • Java常用类解析

    包装类 包装类值基本数据类型对应的引用类型,包装类封装好的方法能够很方便的让我们操作基本数据类型而不需要自己再去编写不必要的代码。 基本数据类型 包装类 boolean Boole…

    数据库 2023年6月16日
    096
  • Redis

    一、了解 1、Nosql概述(同sql的区别) 1&#x3001;&#x5B58;&#x50A8;&#x65B9;&#x5F0F; SQL&…

    数据库 2023年6月6日
    0107
  • 关于.netcore即时生成缩略图踩的坑

    最近在开发一套系统,很多地方用到了缩略图,然而不同的地方用到的尺寸又不一样,上传的时候生成缩略图就没有意义了,因为你不知道会使用到哪些尺寸,于是想到即时生成的办法,前端判断图片是否…

    数据库 2023年6月9日
    0118
  • jenkins 忘记密码

    仅适用centos7 一、 忘记密码 终端输入: vi /root/.jenkins/secrets/initialAdminPassword 复制文本内的密码,进行登录,此密码可…

    数据库 2023年6月14日
    0101
  • 你是否听说过 HashMap 在多线程环境下操作可能会导致程序死循环?

    作者:炸鸡可乐原文出处:www.pzblog.cn 一、问题描述 经常有些面试官会问, 是否了解过 HashMap 在多线程环境下使用时可能会发生死循环,导致服务器 cpu 100…

    数据库 2023年6月14日
    0108
  • leetcode 437. Path Sum III 路径总和 III(中等)

    一、题目大意 给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。 路径 不需要从根节点开始,也…

    数据库 2023年6月16日
    0112
  • day04-3服务器推送新闻

    多用户即时通讯系统04 4.编码实现03 4.7功能实现-服务器推送消息功能实现 4.7.1思路分析 服务器推送新闻,本质其实就是群发消息 在服务器启动一个独立线程,专门负责推送新…

    数据库 2023年6月11日
    084
  • 【数据库】 — MySQL中查询当前时间间隔前1天的数据

    1.背景 在实际项目中,我们会遇到分布式定时任务执行的情况。有时在执行定时任务时,如果查询的数据量比较大,我们会选择执行前几天过滤的数据。 [En] In the actual p…

    数据库 2023年5月24日
    082
  • asyncio 异步编程

    首先了解一下协程,协程的本质就是一条线程,多个任务在一条线程上来回切换,协程的所有切换都是基于用户,只有在用户级别才能感知到的 IO 才会用协程模块来规避,在 python 中主要…

    数据库 2023年6月9日
    089
  • mysql 5.7命令行安装(windows)

    下载mysql-5.7.xx-winx64 ZIP版,https://dev.mysql.com/downloads/mysql/5.7.html 拷贝压缩包文件mysql-5.7…

    数据库 2023年5月24日
    098
  • 不要让“Clean Code”更难维护,请使用“Rule of Three”

    当人们试图将”代码整洁之道(Clean Code)”的原则应用于现有的代码库时,我经常会问这个问题。 我认为这是合情合理的。 当我们开始重构遗留代码时,通常…

    数据库 2023年6月14日
    0124
  • java如何获取一个文本文件的编码(格式)信息呢?

    文本文件是我们在windows平台下常用的一种文件格式, 这种格式会随着操作系统的语言不同,而出现其默认的编码不同 那么如何使用程序获取”文本文件”的编码方…

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