MySql索引详解-各种索引的定义与区别和应用

news2024/11/30 2:36:48

MySql索引详解-各种索引的定义与区别和应用

  • 一、索引基础:增删改查
    • 1.新增索引的几种方式
    • 2.删除索引的几种方式
    • 3.修改索引的几种方式
    • 4.查询索引的几种方式
  • 二、索引的分类
    • 1.主键索引
    • 2.唯一索引
    • 3.普通索引
    • 4.复合索引
    • 5.全文索引
  • 三、总结

什么是索引?索引的作用,有无索引的区别。

一、索引基础:增删改查

以下场景既适用于单值索引也适用于复合索引。

1.新增索引的几种方式

只有主键索引不适用create index 其他均是适用的。

-- 方式一:
create index idx_building_id on tb_mdm_unit(building_id) using btree comment '楼栋id';
-- 方式二:
alter table tb_mdm_unit add index idx_building_id(building_id) using btree comment '楼栋id';
-- 方式三:这里也可以在声明列时直接声明
drop table if exists testTable;
create table testTable(
id tinyint  comment 'id',
column1 tinyint not null comment '列1',
column2 BIGINT not null comment '列2',
column3 MEDIUMINT not null comment '列3',
column4 DATETIME not null comment '列4',
column5 date not null comment '列5',
column6 TIMESTAMP not null comment '列6',
column7 year not null comment '列7',
column8 GEOMETRY not null comment '列8',
column9 varchar(20)  not null comment '列9',
-- PRIMARY key(id) using BTREE comment '主键',
PRIMARY key(id,column1) using BTREE comment '复合主键',
UNIQUE key colu1_idx(column1) using BTREE comment '唯一索引',
UNIQUE key colu1_cdx(column1,column2) using BTREE comment '复合唯一索引',
index colu3_idx(column3) using BTREE comment '普通索引1',
index dolu3_cdx(column3,column4) using BTREE comment '复合普通索引1',
fulltext colu9_idx(column9) comment '全文索引',
SPATIAL index colu8_idx(column8) comment '空间索引'
);

2.删除索引的几种方式

drop index 这种删除方式不适用于主键索引,其他索引均可适用。

drop index idx_building_id on tb_mdm_unit;
alter table tb_mdm_unit drop index idx_building_id;

3.修改索引的几种方式

下面的修改只有在mysql8中才可以使用,是用来将索引标识未可见不可见的(查看可见不可见可以使用show index from table)。索引不可见以后,条件使用索引字段将不走索引。如果是想将单列索引修改成复合索引,这种只能是删了重建才可以。

-- 修改索引可见(mysql8.0以后支持)
alter table tb_mdm_unit alter index idx_building_id visible;
-- 修改索引不可见(mysql8.0以后支持)
alter table tb_mdm_unit alter index idx_building_id invisible;

4.查询索引的几种方式

-- 方式一:查看建表语句,此时可以看到
show create table tb_mdm_floor;
-- 方式二:查看表的所有索引
show index from tb_mdm_floor;
-- 方式三:查看所有列(会标明列上的索引)
show columns from tb_mdm_floor;

二、索引的分类

从功能上对索引进行划分的话,可以划分为以下几种索引。

1.主键索引

非null且唯一,可以为将任意字段类型设置为主键,不过对于blob/text添加主键时必须指明主键长度(其实就是前缀索引),因为blob存储的是二进制文件,text存储的是文本,都比较长,如果使用原始信息做主键,会导致主键过程,从而影响查询效率,下面是测试使用各个字段做主键的sql。
主键使用切记更新,更新会导致BTree的重新计算主键索引位置,很耗时。一般不应该操作主键的更新。
下面是验证各种数据类型是否可以作为主键的sql

drop table if exists testTable;
create table testTable(
id integer comment '主键',
column1 tinyint not null comment '列1',
column2 BIGINT not null comment '列2',
column3 MEDIUMINT not null comment '列3',
column4 DATETIME not null comment '列4',
column5 date not null comment '列5',
column6 TIMESTAMP not null comment '列6',
column7 year not null comment '列7',
column8 char not null comment '列8',
column9 varchar(20)  not null comment '列9',
column10 blob not null comment '列11',
column11 text not null comment '列12',
column12 enum('one','two','three') not null comment '列13',
column13 set('one','two')  comment '列14'
);

alter table testTable add primary key(id) comment '测试主键'; alter table testTable drop PRIMARY key ;
alter table testTable add primary key(column1) comment '测试主键';alter table testTable drop PRIMARY key ;
alter table testTable add primary key(column2) comment '测试主键';alter table testTable drop PRIMARY key ;
alter table testTable add primary key(column3) comment '测试主键';alter table testTable drop PRIMARY key ;
alter table testTable add primary key(column4) comment '测试主键';alter table testTable drop PRIMARY key ;
alter table testTable add primary key(column5) comment '测试主键';alter table testTable drop PRIMARY key ;
alter table testTable add primary key(column6) comment '测试主键';alter table testTable drop PRIMARY key ;
alter table testTable add primary key(column7) comment '测试主键';alter table testTable drop PRIMARY key ;
alter table testTable add primary key(column8) comment '测试主键';alter table testTable drop PRIMARY key ;
alter table testTable add primary key(column9) comment '测试主键';alter table testTable drop PRIMARY key ;
alter table testTable add primary key(column10(10)) comment '测试主键';alter table testTable drop PRIMARY key ; -- blob 只能添加前缀索引类型的主键
alter table testTable add primary key(column11(10)) comment '测试主键';alter table testTable drop PRIMARY key ; -- text 只能添加前缀索引类型的主键
alter table testTable add primary key(column12) comment '测试主键';alter table testTable drop PRIMARY key ;
alter table testTable add primary key(column13) comment '测试主键';alter table testTable drop PRIMARY key ;

主键的新增

-- 方式一:修改表添加
alter table testTable add primary key(column13) comment '测试主键';

-- 方式二:建表字段上指定
drop table if exists testTable;
create table testTable(
id tinyint PRIMARY key auto_increment comment '测试主键'
);

-- 方式三: 建表末尾指定
drop table if exists testTable;
create table testTable(
id tinyint  comment 'id',
PRIMARY key(id) using BTREE comment '测试主键'
);

删除主键

alter table testTable drop PRIMARY key ;

主键的查看,使用索引的通用查看方法即可(第一节中)。此外主键可以是复合索引,主键也可以是前缀索引。如下举例:

alter table testTable add PRIMARY key(id,column1) using btree comment '复合主键索引';
alter table testTable add PRIMARY key(column9(10)) using btree comment '前缀主键索引';

2.唯一索引

非null,可以使用在任何类型的字段上。没有特别要求,都可以使用,可以建立符合唯一索引,前缀唯一索引(这个使用需要慎重),其他的和主键索引的创建删除都没有任何的区别,这里就不重复列举了。

3.普通索引

对字段类型没有要求,可以创建在任何数据类型上,用以提升查询效率。普通索引同样可以是复合索引,也可以是前缀索引,使用上便是第一节的列举情况。

4.复合索引

其实就是普通索引的变种,支持多列共同构建一个索引。使用参考第一节,这里不重复列举了。

5.全文索引

全文索引功能类似于ES,可以根据关键字进行快速查找,在不使用全文索引的情况下,模糊匹配查询 like ‘%张三’,这种会导致索引失效。因此mysql也是在引入了全文索引fulltext,用以支持模糊查询的快速查找,全文索引和模糊查询的效率不是一个量级的。==在MySql5.6以前只有MYISAM支持fulltext,在5.6及以后INNODB和MYISAM均支持全文索引了,且全文索引只能建立在字符串类型上,如char、varchar、text等数据类型。==这里介绍全文索引的基础用法,不深入探讨。
全文索引的新增:

-- 方式一:建表时添加全文索引
drop table if exists testTable;
create table testTable(
id tinyint  comment 'id',
column1 tinyint not null comment '列1',
column8 text not null  comment '经纬度列',
column9 varchar(50) not null comment '列9',
fulltext index colu9_idx(column9) comment '全文索引',
fulltext index colu8_idx(column8,column9) comment '复合全文索引'
);

-- 方式二:使用create index 添加
create fulltext index colu9_fullindex on testTable(column9) comment '全文索引';
-- 方式三:使用alter table 添加
alter table testTable add fulltext index colu8_idx(column8,column9) comment '复合全文索引';

全文索引的删除查看和普通索引没有任何区别,这里不重复说了,来看下全文索引的使用吧:

MATCH (col1,col2,...) AGAINST (expr [search_modifier])
search_modifier:
  {
       IN NATURAL LANGUAGE MODE
     | IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION
     | IN BOOLEAN MODE
     | WITH QUERY EXPANSION
  }

使用举例如下:

-- 插入数据
insert into testTable values
(1,0,'11','zhangsan'),
(2,0,'11','zhangsanlisi'),
(3,0,'11','zhangsanlisiwangwu'),
(4,0,'11','zhangsanlisiwangwuzhaoli'),
(5,0,'11','zhangsanlisiwangwuzhaoliqianqizhangsan');

-- 使用布尔模式进行模糊匹配查找
select * from testTable where MATCH(column9) against('zhang*' in boolean mode);

上面的执行截图:
在这里插入图片描述

6.空间索引
空间索引只能针对空间类型的字段进行建立,mysql中的空间索引和全文索引实现都不是BTREE,所以即使是INNODB也存在多种不同的索引数据结构。mysql的空间类型和对应的索引使用范围不广。mysql中的空间数据类型有4种,分别是GEOMETRY、POINT、LINESTRING、POLYGON。创建空间索引的列,必须将其声明为NOT NULL。
空间索引的建立:

-- 方式一
create spatial index colu8_idx on testTable(column8) comment '空间索引';
-- 方式二
alter table testTable add spatial index colu8_idx(column8) comment '空间索引';
-- 方式三
drop table if exists testTable;
create table testTable(
id tinyint  comment 'id',
column1 tinyint not null comment '列1',
column2 BIGINT not null comment '列2',
column3 MEDIUMINT not null comment '列3',
column4 DATETIME not null comment '列4',
column5 date not null comment '列5',
column6 TIMESTAMP not null comment '列6',
column7 year not null comment '列7',
column8 GEOMETRY not null comment '列8',
column9 varchar(20)  not null comment '列9',
-- PRIMARY key(id) using BTREE comment '主键',
PRIMARY key(id,column1) using BTREE comment '复合主键',
UNIQUE key colu1_idx(column1) using BTREE comment '唯一索引',
UNIQUE key colu1_cdx(column1,column2) using BTREE comment '复合唯一索引',
index colu3_idx(column3) using BTREE comment '普通索引1',
index dolu3_cdx(column3,column4) using BTREE comment '复合普通索引1',
fulltext colu9_idx(column9) comment '全文索引',
SPATIAL index colu8_idx(column8) comment '空间索引'
);

空间缩影的删除和查看等都和普通索引没有什么区别,这里就不重复写入了。

三、总结

这里介绍的都是基础的索引的增删改查,和一些索引使用的案例以及注意事项。我们常用的其实还是主键索引、唯一索引、普通索引,复合索引、前缀索引(字符串或者二进制类型建立普通索引是可以建立前缀索引),其他的全文和空间索引其实是不常用的。这里列出来作为了解吧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/48980.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【DL with Pytorch】第 6 章 : 用循环神经网络分析数据序列

🔎大家好,我是Sonhhxg_柒,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎 📝个人主页-Sonhhxg_柒的博客_CSDN博客 📃 🎁欢迎各位→点赞…

PointRend 原理与代码解析

paper:PointRend: Image Segmentation as Rendering code1:https://github.com/facebookresearch/detectron2/tree/main/projects/PointRend code2:https://github.com/open-mmlab/mmsegmentation/tree/master/configs/point_rend 创新点…

[附源码]Python计算机毕业设计Django的花店售卖系统的设计与实现

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

[附源码]SSM计算机毕业设计学习资源共享与在线学习系统JAVA

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

全局路由拦截、局部路由拦截

引入: 看下面这个效果: 每次我们在点击一个功能时,它就会跳转到登录页面,意思就是让我们先登录,登录之后再进行功能操作;但是如果我们登录了,它就不会跳转,这是什么原理呢&#x…

vue3Blog首页基础布局样式规划

思考:我们已经安装了一个ant-design-vue的组件库,是否还可以安装其他的UI组件库混合使用? 答案是可以的,比如这个组件库没有要用到的组件,但另外一个组件有,我们完全可以再安装,单独将某一个使用到的组件引入即可,当项目打包的时候也不会说把所有的安装的都打包进去,只…

VS Code + Vue 开发环境搭建

1、下载并安装 Visual Studio Code 2019 2、Visual Studio Code 2019安装成功后,打开VS Code 工具点击左侧【扩展】菜单,在搜索栏中输入 Chinese 查找中文语言汉化包插件下载安装,然后重启VS Code 3、点击左侧【扩展】菜单,在搜…

【JS】数据结构之图结构

文章目录基本概念图的实现基本概念 什么是图? 图是一种数据结构,与树结构有些相似(在数学的概念上,树是图的一种)树结构是一对多的关系,而图结构是多对多的关系比如导航的最优路径:可以看成多个…

【Pandas数据处理100例】(一百):Pandas中使用filter()过滤器实现数据筛选

前言 大家好,我是阿光。 本专栏整理了《Pandas数据分析处理》,内包含了各种常见的数据处理,以及Pandas内置函数的使用方法,帮助我们快速便捷的处理表格数据。 正在更新中~ ✨ 🚨 我的项目环境: 平台:Windows10语言环境:python3.7编译器:PyCharmPandas版本:1.3.5N…

Oracle的学习心得和知识总结(八)|Oracle数据库PL/SQL语言GOTO语句技术详解

目录结构 注:提前言明 本文借鉴了以下博主、书籍或网站的内容,其列表如下: 1、参考书籍:《Oracle Database SQL Language Reference》 2、参考书籍:《PostgreSQL中文手册》 3、EDB Postgres Advanced Server User Guid…

Java常见漏洞——整数溢出漏洞、硬编码密码漏洞、不安全的随机数生成器

目录 前言: (一)整数溢出漏洞 0x01 整数溢出漏洞介绍 1.1 上界溢出 1.2 下界溢出 0x02 整数溢出漏洞修复 (二)硬编码密码漏洞 修复案例: (三)不安全的随机数生成器 前言&a…

1、Shell 概述

文章目录1、Shell 概述1.1 Linux 提供的 Shell 解析器有1.2 bash 和 sh 的关系1.3 Centos 默认的解析器是 bash尚硅谷2022版Linux扩展篇Shell教程-讲师:武晟然 壁立千仞 无欲则刚 1、Shell 概述 硬件–>操作系统核心(Linux内核)–>解释…

ubuntu2004 有线与另一个Ubuntu系统通信

在Ubuntu2004(从机)打开一个终端,输入如下配置有线网络ip,其中eth0 为有线网络的名称,up使能有线网络eth0: ifconfig eth0 192.169.10.2 up 并在.bashrc文件中输入 export ROS_MASTER_URIhttp://192.169.10.1:11311 …

Java多线程之线程池

Java高并发应用开发过程中会频繁的创建和销毁线程,为了节约成本和提升性能,往往会使用线程池来统一管理线程,使用线程池主要有以下几点优势 降低资源消耗:重复利用已创建的线程降低线程创建和销毁造成的消耗 提高响应速度&#xf…

ImageNet classification with deep convolutional neural networks

使用深度卷积神经网络进行ImageNet图像分类 目录 1.引言 2.网络结构 2.1 小细节 2.2 代码部分 3. 创新点 3.1 非线性激活函数ReLU(提速) 3.2 多GPU训练(提速) 3.3局部响应归一化(增强泛化能力,已不…

我国天宫空间站以及各个仓位介绍

一、天宫空间站 天宫空间站(China Space Station)是中国从2021年开始建设的一个模块化空间站系统,为人类自1986年的和平号空间站及1998年的国际空间站后所建造的第三座大型在轨空间实验平台,基本构型由天和核心舱、问天实验舱和梦…

Head First设计模式(阅读笔记)-07.适配器模式

火鸡冒充鸭子 现在缺少一个绿头鸭对象,需要用野生火鸡对象冒充一下,但是二者的接口都不一样该怎么去冒充呢? // 鸭子接口 public interface Duck{public void quack(); // 呱呱叫public void fly(); // 飞行 } // 火鸡接口 public interfac…

应力奇异,你是一个神奇的应力!

在用ANSYS进行压力容器应力分析计算的时候,总会出现一些应力集中的问题,而且,有些应力集中点竟然没办法采用倒圆角的办法消除,采用网格加密方法时,甚至应力值比之前更大。这个情况,大家通常称为应力奇异。 …

springboot-mybatisplus-redis二级缓存

前言 mybatis可以自己带有二级缓存的实现&#xff0c;这里加上redis是想把东西缓存到redis中&#xff0c;而不是mybaits自带的map中。这也就构成了我们看到的springboot mybatisplus redis实现二级缓存的题目。 具体步骤如下&#xff1a; 首先加入需要的依赖 <dependenc…

《InnoDB引擎六》InnoDB 1.0.x版本之前的Master Thread

Master Thread 工作方式 在后台线程中提到&#xff0c;Master Thread是核心的后台线程。InnoDB存储引擎的主要工作都是在一个单独线程中完成的。 InnoDB 1.0.x版本之前的Master Thread Master Thread具有最高的线程优先级别。内部由多个循环组成&#xff1a;主循环(loop)、后台…