MySQL数据库之索引详解

目录
  • 一、MySQL索引简介
  • 二、MySQL五种类型索引详解
    • (一)普通索引
    • (二)唯一性索引
    • (三)主键索引
    • (四)复合索引
    • (五)全文索引
  • 三、MySQL索引使用原则
  • 总结

今天继续给大家介绍MySQL相关知识,本文主要内容是MySQL索引相关内容。

一、MySQL索引简介

索引是MySQL数据库为了加快数据查询的速度,给表中的某一个或者是某几个列添加的一种“目录”。MySQL的索引是一个特殊的文件,但是InnoDB类型引擎(关于MySQL的引擎我们会在今后的文章中进行讲解)的表的索引是表空间的一个组成部分。
MySQL数据库一共支持5种类型的索引,分别是普通索引、唯一性索引、主键索引、复合索引和全文索引,下面,我将对这四种类型的索引一一介绍。

二、MySQL五种类型索引详解

(一)普通索引

普通索引是MySQL数据库中的一种普通的索引,添加普通索引的列对数据没有特殊要求,普通索引能起到的作用就是加快差查询速度。
在创建数据表时添加普通索引SQL语句示例如下:

create table exp(id int , name varchar(20),index exp_name(name));

或者是把index换成key,如下:

create table exp (id ,int , name varahcr (20) ,  key exp_name(name));

在上述SQL命令中,key或者index表示添加索引,后面紧跟着的是索引名称,后面括号里的是要添加索引的列。
本文介绍的所有索引相关的SQL语句,如果没有特殊说明,index都可以换成key,为了节省文章篇幅,这一点在以后就不再赘述了。
此外,我们也可以在添加索引时,不指定索引的名称,这时,MySQL会自动为该索引添加与该字段同名的索引名。
执行结果如下:

创建数据表后向表内新添加普通索引SQL语句示例如下:

alter table exp add index exp_id(id);

执行结果如下:

创建数据表后删除普通索引的SQL语句示例如下:

alter table drop index exp_name;

执行结果如下:

注意,在上述命令中,exp_name是索引的名字而不是含有索引的字段的名字,如果我们忘记了该表中的索引名称,可以执行以下SQL命令进项查询:

show index from exp;

其中,exp是表名,该命令执行结果如下:

从上面几张图片可以看出,添加普通索引后,在使用desc查看表结构时,会发现Key列上出现MUL,这就表示该列添加有普通索引。

(二)唯一性索引

唯一性索引,是在普通索引的基础上,要求添加该索引的列所有的值只能出现一次。唯一性索引常用语添加在注入身份证号、学号等字段中,不可以添加在注入名字、等字段中。
唯一性索引的添加与普通索引几乎完全相同,只不过要把普通索引的关键字key和index换成unique key和unique index。
在创建数据表时添加唯一性索引的SQL语句示例如下:

create table exp (id int, name varchar(20), unique key (name));

上述命令执行结果如下:

可以看出,添加唯一性索引的字段,在使用desc命令查询表结构时,Key列中会显示UNI,表示该字段添加了唯一性索引。
在创建数据表后添加唯一性索引的SQL语句实例如下:

删除唯一性索引的SQL语句示例如下:

alter table exp drop index name;

执行结果如下:

(三)主键索引

主键索引,是数据库的所有索引中查询速度最快的,并且每个数据表只能有1个主键索引列。主键索引的列,不允许出现重复的数据,也不允许为空值。
添加、删除主键索引与普通索引和唯一性索引非常相似,只不过将key换成了primary key而已。相关SQL命令如下:

create table exp(id int ,name varchar(20), primary key (id));alter table exp add primary key (id);

添加了主键索引的列,会在desc查看表结构时Key列上显示PRI,如下所示:

主键索引的删除可以执行命令:

alter table exp drop primary key;

注意,在该SQL语句总,key不能换成index。
有时,我们在尝试删除主键索引时,MySQL后拒绝,这可能是因为该字段添加了auto_increment属性的缘故,我们可以把该字段修饰符删除,就可以删除该字段的主键索引了,如下所示:

(四)复合索引

如果想要创建一个包含不同的列的索引,我们就可以创建符合索引。其实,复合索引在业务场景中应用的非常频繁,比如,如果我们想要记录数据包的内容,则需要将IP和端口号作为标识数据包的依据,这时就可以把IP地址的列和端口号的列创建为复合索引。复合、添加和删除索引创建SQL语句示例如下:

create table exp (ip varchar(15),port int ,primary key (ip,port));
alter table exp add pirmary key(ip ,port);
alter table exp dorp priamary key;

复合索引在创建后,在使用desc查看数据表结构时,会在Key列中发现多个PRI,这就表示这些含有PRI的列就是复合索引的列了。如下所示:

注意,复合索引相当于一个多列的主键索引,因此,添加复合索引的任何一个列都不允许数据为空,并且这些列不允许数据完全相同,否则MySQL数据库会报错。如下所示:

(五)全文索引

全文索引主要是用于解决大数据量的情况下模糊匹配的问题。如果数据库中某个字段的数据量非常大,那么如果我们想要使用like+通配符的方式进行查找,速度就会变得非常慢。针对这种情况,我们就可以使用全文索引的方式,来加快模糊查询的速度。全文索引的原理便是通过分词技术,分析处文本中关键字及其出现的频率,并依次建立索引。全文索引的使用,与数据库版本、数据表引擎乃至字段类型息息相关,主要限制如下:
1、MySQL3.2版本以后才支持全文索引。
2、MySQL5.7版本以后MySQL才内置ngram插件,全文索引才开始支持中文。
3、MySQL5.6之前的版本,只有MyISAM引擎才支持全文索引。
4、MySQL5.6以后的版本,MyISAM引擎和InnoDB引擎都支持全文索引。
5、只有字段数据类型为char、varchar、以及text的字段才支持添加全文索引。
创建、添加以及删除全文索引SQL命令如下:

create table exp (id int ,content text ,filltext key (content))engine=MyISAM;
alter table exp add fulltext index (content);
alter table exp drop index content;

部分执行结果如下:

在创建了全文索引后,也不能够使用like+通配符的方式进行模糊查询,全文索引的使用有其特定的语法,如下所示:

select * from exp where match(content) against ('a');

其中,match后面的括号里是含有全文索引的字段,against后面的括号里是要模糊匹配的内容。
此外,全文索引的作用并不是唯一的,在很多场景下,我们并不会使用MySQL数据库内置的全文索引,而是使用第三方类似的索引以实现相同的功能。

三、MySQL索引使用原则

1、索引是典型的“以空间换时间”的策略,它会消耗计算机存储空间,但是会加快查询速度。
2、索引的添加,尽管加快了在查询时的查询速度,但是会减慢在插入、删除时的速度。因为在插入、删除数据时需要进行额外的索引操作。
3、索引并非越多越好,数据量不大时不需要添加索引。
4、如果一个表的值需要频繁的插入和修改,则不适合建立索引,反制,如果一个表中某个字段的值要经常进行查询、排序和分组的字段则需要建立索引。
5、如果一个字段满足建立唯一性索引的条件,就不要建立普通索引。

总结

到此这篇关于MySQL数据库之索引详解的文章就介绍到这了,更多相关MySQL索引内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 深入解析MySQL索引数据结构

    目录 概述 索引数据结构 二叉树 红黑树 B-Tree B+Tree Hash 索引 InnoDB 索引实现(聚集) 索引文件和数据文件是分离的(非聚集) 聚集索引和非聚集索引 联合/复合索引 参考资料 总结 概述 索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息. 索引数据结构 二叉树 二叉树(binary tree)是指树中节点的度不大于 2 的有序树,它是一种最简单且最重要的树.二叉树的递归定义为:二叉树是一棵空树,或者是一棵由一个根节点和两棵互不

  • MySQL索引优化之分页探索详细介绍

    目录 ​​MySQL​​索引优化之分页探索 案例一 案例二 ​​MySQL​​索引优化之分页探索 表结构 CREATE TABLE `demo` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '姓名', `age` int(11) NOT NULL DEFAULT '0'

  • MySQL索引失效原理

    目录 1.索引失效原因 2.再来看看哪些情况会破坏索引的有序性. - 对索引字段做函数操作 - 隐式类型转换 - 隐式字符编码转换 3.总结 1.索引失效原因 首先看看哪些情况下,将会导致查找不能利用索引的有序性. 假设一个表test中有a,b,c,d四个字段,c是主键. 在a,b字段上建立联合索引(a,b):CREATE index idx_a_b on test(a,b); B+树联合索引.JPG 可以得到的规律是:优先按a字段从小到大排序,a字段相等的按b字段从小到大排序: 分析以下情况,

  • MySQL 数据库 索引和事务

    目录 1. 索引 1.1 概念 1.2 作用 1.3 索引的原理 1.3.1 减少磁盘的访问次数是构建索引的核心思想 1.3.2 B+ 树适用实现索引的底层 1.4 适用场景 1.5 使用语句 1.5.1 查看索引 1.5.2 创建索引 1.5.3 删除索引 2. 事务 2.1 概念 2.2 为什么使用事务 2.3 四大属性 2.3.1 原子性 2.3.2 一致性 2.3.3 持久性 2.3.4 隔离性 2.4 使用方法 1. 索引 1.1 概念 索引是为了加速对表中数据行的检索而创建的一种分散

  • MySQL数据库之索引详解

    目录 一.MySQL索引简介 二.MySQL五种类型索引详解 (一)普通索引 (二)唯一性索引 (三)主键索引 (四)复合索引 (五)全文索引 三.MySQL索引使用原则 总结 今天继续给大家介绍MySQL相关知识,本文主要内容是MySQL索引相关内容. 一.MySQL索引简介 索引是MySQL数据库为了加快数据查询的速度,给表中的某一个或者是某几个列添加的一种"目录".MySQL的索引是一个特殊的文件,但是InnoDB类型引擎(关于MySQL的引擎我们会在今后的文章中进行讲解)的表的

  • MySQL 数据库 source 命令详解及实例

    MySQL 数据库 source 命令详解及实例 MySQL 数据库 source 命令,该命令是数据库导入命令.source 命令的用法非常简单,首先你需要进入 MySQL 数据库的命令行管理界面,然后选择需要导入的数据库,执行 source 命令.如下图所示. MySql 数据库 source 命令 mysql> use test Database changed mysql> set names utf8; Query OK, 0 rows affected (0.00 sec) mys

  • 在windows上安装不同(两个)版本的Mysql数据库的教程详解

    1.起因: 需要导入一个sql文件,发现死活导不进去.当执行到这一句时,就有问题.经过一番搜索,原来是我的数据库版本(原先Mysql版本5.5)低了,而支持该语句的版本应该是至少要5.7.那我索性就去Mysql官网去下载了个最新版本的(8.0.15). `create_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP 2.过程: 那么问题来了:有两个解决方案.1.直接卸载掉5.5版本的Mysql,直接安装8.0.15版本的.2.在不卸

  • CentOS7安装调试Mysql数据库的步骤详解【实例】

    本实例要求下载并安装调试Mysql数据库. 第一步:下载Mysql数据库安装所需的全部软件. 我已提前下载好数据库软件,直接在服务器下载即可,如下: 通过scp直接下载: [root@agt20 ~]# scp root@192.168.122.10:/root/mysql* /root/ 软件如下图: [root@agt20 ~]# ls mysql-* mysql-5.7.17.tar mysql-community-client-5.7.17-1.el7.x86_64.rpm mysql-

  • 在IntelliJ IDEA中使用Java连接MySQL数据库的方法详解

    一.下载MySQL数据库并进行安装和配置 下载地址:https://dev.mysql.com/downloads/installer/ 二.下载JDBC连接器 下载地址:mysql-connector-java-8.0.22 下载好压缩包并解压后找到mysql-connector-java-8.0.22.jar文件放在自己指定的路径下. 三.在项目中导入jar包 用于测试数据库连接的测试类Test.java代码: import java.sql.Connection; import java.

  • Linux手动部署远程的mysql数据库的方法详解

    一.安装mysql 运行以下命令更新YUM源. rpm -Uvh  http://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm 运行以下命令安装MySQL. yum -y install mysql-community-server 运行以下命令查看MySQL版本号. mysql -V 返回结果如下,表示MySQL安装成功. mysql  Ver 14.14 Distrib 5.7.31, for Linux (x86_

  • nodejs环境快速操作mysql数据库的方法详解

    github地址https://github.com/dmhsq/dmhsq-mysql-db 可用于腾讯云SCF以及云开发环境 错误处理尚未完善 错误参考mysql错误 引入依赖包 npm install dmhsq-mysql-db 效果如下 简化了mysql的使用 安装依赖 npm install dmhsq-mysql-db 使用示例 快速操作mysql 错误处理尚未完善 部分错误参考mysql错误 引入资源 const database = require("dmhsq-mysql-d

  • python中的mysql数据库LIKE操作符详解

    LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式. 语法: SELECT column_name(s) FROM table_name WHERE column_name LIKE pattern pattern这里就是放指定模板的地方,而这里就要用到" % ",也叫做通配符 %如果是放在条件前面,那就是查以...结尾的数据:例如:%李 %如果是放在条件后面,那就是查以...开头的数据:例如:李% %如果是在条件前后都存在,那就是查包含的数据:例如:%李% 小知识点: ER

  • MySQL数据库JDBC编程详解流程

    目录 一.数据库编程的必备条件 二.Java的数据库编程:JDBC 三.JDBC工作原理 四.JDBC开发步骤 五.JDBC操作步骤 六.优化JDBC的部分代码 1.获取数据库连接对象 2.操作命令对象Statement 3.ResultSet对象 4.总结 一.数据库编程的必备条件 编程语言: 如Java.C++.C.Python等 数据库: 如Oracle.MySQL.SQL Server等 数据库驱动包: 不同的数据库,要使用编程语言来操作时,就需要使用该数据库厂商提供的数据库驱动包. 如

  • Mysql数据库 ALTER 操作详解

    目录 背景: 案例一:将表employees的lastName字段修改到firstName字段后面,并减少字符长度. 案例二:将表employees的sex字段改名为employee_sex. 案例三:修改employee_sex字段,数据类型为CHAR(1),非空约束 案例四:删除字段employee_sex 案例五:增加字段名city,数据类型为VARCHAR(10). 案例六:将表employees名称修改为employees_info 背景: ALTER作为DDL语言之一,工作中经常遇到

随机推荐