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)

大家都在看

  • windows和乌班图使用固定的ip地址

    windows设置固定的ip地址:查看网上的方法很多人说修改无线网卡的配置:自动获取ip—-》使用下面的IP地址这样修改以后无法使用wifi上外网但是确实可以添加一个固…

    数据库 2023年6月11日
    0116
  • 数据结构知识详解 第一章 绪论

    知识框架 1. 数据结构的基本概念 1.1 基本概念和术语 1.1.1 数据 定义:是信息的载体,是描述客观事实属性的数、字符及所有能输入到计算机中并被计算机程序识别和处理的符号的…

    数据库 2023年6月11日
    075
  • 关于在vue项目中引入<el-img>标签失败的问题

    问题如下 语法没有写错,但是冒号错了,不能在img后面紧接着冒号 只能在src前面紧接着冒号 Original: https://www.cnblogs.com/ly-heker/…

    数据库 2023年6月11日
    082
  • 二叉树遍历的常用方法

    概述 二叉树的遍历可以说是解决二叉树问题的基础。我们常用的遍历方式无外乎就四种 &#x524D;&#x5E8F;&#x904D;&#x5386;、 …

    数据库 2023年6月11日
    078
  • SpringBoot 中发布ApplicationEventPublisher,监听ApplicationEvent 异步操作

    有这么一个业务场景:当用户注册后,发送邮件到其邮箱提示用户进行账号激活,且注册成功的同时需要赠送新人用户体验卡券。 业务有了,那么问题也就来了。 What? 问题….问…

    数据库 2023年6月6日
    0263
  • 一句话的需求怎么测?需求文档的三种现状及应对策略

    转载请注明出处❤️ 你好,我是测试蔡坨坨。 今天,我们来聊聊需求文档那些事儿…… 众所周知,软件需求是软件项目研发的开始,是组建研发团队后第一次集体讨论的事…

    数据库 2023年6月11日
    083
  • DNS 查询原理详解

    你可能会问,难道 DNS 服务器(比如 1.1.1.1)保存了世界上所有域名(包括二级域名、三级域名)的 IP 地址? 当然不是。DNS 是一个分布式系统,1.1.1.1 只是用户…

    数据库 2023年6月14日
    0105
  • MySql Explain字段解析

    MySql Explain字段解析 id id列表示select的序号,查询Sql中有几个select就会有几个id。 id的值越大,该查询的优先级超高。 select_type …

    数据库 2023年5月24日
    085
  • try enabling the break write locks option for the cleanup

    如图: 一般是在中断:提交/更新的时候产生的。 一般两种解决方式(可以参考其他的): 1,重启ide(我的就是这么神奇,重启idea后好了); 2,在cleanup时勾选 brea…

    数据库 2023年6月11日
    0121
  • Docker简介

    1.什么是Docer 在计算机的世界中,容器拥有一段漫长且传奇的历史。容器与管理程序虚拟化 (hypervisor virtualization,HV)有所不同,管理程序虚拟化通过…

    数据库 2023年6月14日
    094
  • 私人菜谱

    红烧排骨食材:排骨一斤半 花椒葱姜蒜 豆瓣酱 生抽 耗油 白糖 两个大土豆步骤:少量油 花椒葱姜蒜(大块儿)爆香 一大勺豆瓣酱 倒入排骨翻炒一会儿 倒入一锅铲生抽 一小撮耗油撒一撮…

    数据库 2023年6月6日
    089
  • 初识MySQL数据库

    一 、引言 假设现在你已经是某大型互联网公司的高级程序员,让你写一个火车票购票系统,来hold住双十一期间全国的购票需求,你怎么写? 因为同时抢票的人太多,你的程序不可能写在一台机…

    数据库 2023年5月24日
    0108
  • 《Redis设计与实现》

    由浅到深,逐步讲解Redis 本书主要分为四大部分。 第一部分”数据结构与对象”: 介绍了Redis中的各种对象及其数据结构,并说明这些数据结构如何影响对象…

    数据库 2023年6月6日
    090
  • Binlog分析利器-binlog_summary.py

    ​Binlog中,除了具体的SQL,其实,还包含了很多有价值的信息,如, 拿到上面这些信息,我们可以做哪些事情呢? 开发了一个简单的Binlog分析工具-binlog_summar…

    数据库 2023年6月11日
    098
  • 设计模式之(8)——代理模式

    定义:为某个对象提供一个代理,以达到对这个对象的访问控制,代理类和委托类有共同的父类或者父接口,这样可以在使用委托类的地方都可以使用代理对象来替换(这符合程序设计中的”…

    数据库 2023年6月14日
    078
  • JSP中的JSTL 标签库

    JSTL 标签库 JSTL 标签库的使用步骤 core 核心库使用 JSTL 标签库 JSTL 标签库 全称是指 JSP Standard Tag Library JSP 标准标签…

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