Mysql索引的应用

news2024/9/23 15:32:13

文章目录

  • 一、索引介绍
    • 1. 索引的概念
    • 2. 索引的作用与副作用
      • 2.1 索引的作用
      • 2.2 索引的副作用
      • 2.3 如何实现索引
    • 3. 创建索引的原则依据
    • 4. 索引的分类和创建
      • 4.1 普通索引
        • 直接创建索引
        • 修改表方式创建
        • 创建表的时指定索引
      • 4.2 唯一索引
        • 直接创建唯一索引
        • 修改表方式创建
        • 创建表的时候指定
      • 4.3 主键索引
        • 创建表的时指定
        • 修改表方式创建
      • 4.4 组合索引
      • 4.5 全文索引(FULLTEXT)
        • 直接创建索引
        • 修改表方式创建
        • 创建表的时指定索引
        • 使用全文索引查询
    • 5. 查看索引
    • 6. 删除索引
      • 6.1 直接删除索引
      • 6.2 修改表方式删除索引
      • 6.2 删除主键索引
    • 7. 分析是否使用索引

一、索引介绍

1. 索引的概念

索引是一个排序的列表,在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址(类似于c语言的链表通过指针指向数据记录的内存地址)。使用索引后可以不用扫描全表来定位某行的数据,而是先通过索引表找到该行数据对应的物理地址然后访问相应的数据,因此能加快数据库的查询速度。索引是表中一列或者若干列值排序的方法。

简单来说索引就好比是一本书的目录,可以根据目录中的页码快速找到所需的内容。建立索引的目的是加快对表中记录的查找或排序

2. 索引的作用与副作用

2.1 索引的作用

  • 设置了合适的索引之后,数据库利用各种快速定位技术,能够大大加快查询速度,这是创建索引的最主要的原因。
  • 当表很大或查询涉及到多个表时,使用索引可以成千上万倍地提高查询速度。
  • 可以降低数据库的IO成本,并且索引还可以降低数据库的排序成本。
  • 通过创建唯一性索引,可以保证数据表中每一行数据的唯一性。
  • 可以加快表与表之间的连接。
  • 在使用分组和排序时,可大大减少分组和排序的时间。
  • 建立索引在搜索和恢复数据库中的数据时能显著提高性能。

总结:索引的作用其实就是加快表的查询速度,同时对表的字段进行排序。

2.2 索引的副作用

索引需要占用额外的磁盘空间。对于 MyISAM 引擎而言,索引文件和数据文件是分离的,索引文件用于保存数据记录的地址。而 InnoDB 引擎的表数据文件本身就是索引文件。

更新一个包含索引的表需要比更新一个没有索引的表花费更多的时间,这是由于索引本身也需要更新。因此,理想的做法是仅仅在常常被搜索的列(以及表)上面创建索引。

2.3 如何实现索引

没有索引的情况下,要查询某行数据,需要先扫描全表来定位某行数据
有索引后会通过查找条件的字段值找到其索引对应的行数据的物理地址,然后根据物理地址访问相应的数据。

有索引后会通过查找条件的字段值找到其索引对应的行数据的物理地址,然后根据物理地址访问相应的数据。

3. 创建索引的原则依据

	索引虽可以提升数据库查询的速度,但并不是任何情况下都适合创建索引。因为索引本身会消耗系统资源,在有索引的情况下,数据库会先进行索引查询,然后定位到具体的数据行,如果索引使用不当,反而会增加数据库的负担。
  • 表的主键、外键必须有索引。因为主键具有唯一性,外键关联的是主表的主键,查询时可以快速定位。
  • 记录数超过300行的表应该有索引。如果没有索引,每次查询都需要把表遍历一遍,会严重影响数据库的性能。
  • 经常与其他表进行连接的表,在连接字段上应该建立索引。
  • 唯一性太差的字段不适合建立索引(有重复值的字段),会降低效率。
  • 更新太频繁地字段不适合创建索引。
  • 经常出现在 where子句中的字段,特别是大表的字段,应该建立索引。
  • 在经常进行GROUP BY(分组)、ORDER BY(排序)的字段上建立索引。
  • 索引应该建在选择性高的字段上(重复率较小的字段)。
  • 索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引。由于索引需要表来记录索引的字段,如果存储大文本字段,会占用更多的资源,降低效率。

4. 索引的分类和创建

create table member (id int (10),name varchar(10),cardid int(18) , phone int (11),adress varcohar(50),remark text);

4.1 普通索引

最基本的索引类型,没有唯一性之类的限制。

直接创建索引

CREATE INDEX 索引名 ON 表名 (列名[(length)]);

注意:

  • (列名(length))length是可选项。如果忽略 length 的值,则使用整个列的值作为索引。如果指定使用列前的 length 个字符来创建索引,这样有利于减小索引文件的大小。在不损失精准性的情况下,长度越短越好。
  • 索引名建议以“_index”结尾。
例如
create index phone_index on member (phone);
select phone from member;
show create table member;

修改表方式创建

ALTER TABLE 表名 ADD INDEX 案引名 (列名);

例如
alter table member add index id_index (id);
select id from member;
select id,name from member;

在这里插入图片描述

创建表的时指定索引

CREATE TABLE 表名 ( 字段1 数据类型,字段2 数据类型[,...],INDEX 索引名 (列名));

例如
create table test(id int(4) not null,name varchar(10) not null,cardid varchar(18) not null,index id_index (id));
show create table test;

在这里插入图片描述

4.2 唯一索引

与普通索引类似,但区别是唯一索引列的每个值都唯一。

唯一索引允许有空值(注意和主键不同)。如果是用组合索引创建,则列值的组合必须唯一。添加唯一键将自动创建唯一索引。

直接创建唯一索引

CREATE UNIQUE INDEX 索引名 ON 表名(列名);

例如
select * from member;
create unique index address_index on member (address);
create unique index name_index on member (name);
show create table member;

在这里插入图片描述

修改表方式创建

CREATE TABLE 表名 (字段1 数据类型,字段2 数据类型[,...],UNIQUE 索引名 (列名));

例如
create table amd2 (id int,name varchar(20),unique id_index (id));
show creat table amd2;

在这里插入图片描述

创建表的时候指定

在这里插入图片描述

4.3 主键索引

是一种特殊的唯一索引,必须指定为 “PRIMARY KEY”。

一个表只能有一个主键,不允许有空值。 添加主键将自动创建主键索引。

创建表的时指定

CREATE TABLE 表名 ([...],PRIMARY KEY (列名));

在这里插入图片描述

修改表方式创建

ALTER TABLE 表名 ADD PRIMARY KEY (列名); 

在这里插入图片描述

4.4 组合索引

可以是单列上创建的索引,也可以是在多列上创建的索引。

CREATE TABLE 表名 (列名1 数据类型,列名2 数据类型,列名3 数据类型,INDEX 索引名 (列名1,列名2,列名3));

select * from 表名 where 列名1='...' AND 列名2='...' AND 列名3='...';

在这里插入图片描述

例:create table amd1 (id int not null,name varchar(20),cardid varchar(20),index index_amd (id,name));
show create table amd1;
insert into amd1 values(1,'zhangsan','123123');
select * from amd1 where name='zhangsan' and id=1;

4.5 全文索引(FULLTEXT)

适合在进行模糊查询的时候使用,可用于在一篇文章中检索文本信息。

在 MySQL5.6 版本以前FULLTEXT 索引仅可用于 MyISAM 引擎,在 5.6 版本之后 innodb 引擎也支持 FULLTEXT 索引。

全文索引可以在 CHAR、VARCHAR 或者 TEXT 类型的列上创建。每个表只允许有一个全文索引。

直接创建索引

CREATE FULLTEXT INDEX 索引名 ON 表名 (列名);

例如
select * from member;
create fulltext index remark_index on member (remark);

在这里插入图片描述

修改表方式创建

ALTER TABLE 表名 ADD FULLTEXT 索引名 (列名);

例如
alter table member add fulltext index remark (remark);

在这里插入图片描述

创建表的时指定索引

CREATE TABLE 表名 (字段1 数据类型[,...],FULLTEXT 索引名 (列名));

数据类型可以为 CHAR、VARCHAR 或者 TEXT。

在这里插入图片描述

使用全文索引查询

SELECT * FROM 表名 WHERE MATCH(列名) AGAINST('查询内容');

例如
select * from member where match(remark) against('this is vip');

5. 查看索引

show index from 表名;
show index from 表名\G; 		#竖向显示表索引信息
show keys from 表名;
show keys from 表名\G;

各字段的含义如下

字段含义
Table表的名称
Non_unique如果索引不能包括重复词,则为 0;如果可以,则为 1
Key_name索引的名称。
Seq_in_index索引中的列序号,从 1 开始。
Column_name列名称。
Collation列以什么方式存储在索引中。在 MySQL 中,有值 A(升序)或 NULL(无分类)。
Cardinality索引中唯一值数目的估计值。
Sub_part如果列只是被部分地编入索引,则为被编入索引的字符的数目。如果整列被编入索引,则为 NULL
Packed指示关键字如何被压缩。如果没有被压缩,则为 NULL
Null如果列含有 NULL,则含有 YES。如果没有,则该列含有 NO
Index_type用过的索引方法(BTREEFULLTEXTHASHRTREE)。
Comment备注。

6. 删除索引

6.1 直接删除索引

DROP INDEX 索引名 ON 表名;

例:drop index name_index on member;

在这里插入图片描述

6.2 修改表方式删除索引

ALTER TABLE 表名 DROP INDEX 索引名;

例如
alter table member drop id_index;
show index from member;

在这里插入图片描述

6.2 删除主键索引

ALTER TABLE 表名 DROP PRIMARY KEY;

例如
alter table member drop primary key;
show index from member;

在这里插入图片描述

7. 分析是否使用索引

EXPLAIN 来分析和优化,explain 显示了 MySQL 如何使用索引来处理 select 语句以及连接表。

explain 的相关参数:

参数含义
possible_keys显示可能应用在这张表中的索引。
key实际使用的索引。如果为 NULL,则没有使用索引。
key_len使用的索引的长度。在不损失精确性的情况下,长度越短越好。
ref显示索引的哪一列被使用了,如果可能,则是一个常数。
Extra关于 MySQL 如何解析查询的额外信息。
explain select语句  		#可以用户分析select查询语句,看key字段,确定是否使用了索引或索引使用是否正确

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

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

相关文章

Linux-- vi / vim 编辑器

目录 vi \ vim 编辑器的三种编辑模式 vi \ vim 的使用 模式的切换 命令模式下的命令 底线模式 vi \ vim 是visual interface 的简称, 是linux中的经典文本编辑器, 同图形化界面中的文本编辑器一样, 但是vi是使用命令行来对文本进行编辑的最好选择 vim是vi的加强版本, 兼容vi的…

15-2.自定义组件的数据

目录 1 data与method 2 properties 2.1 基本使用 2.2 properties在小程序中可读可写 2.3 对properties使用setData() 3 数据监听器 observers 3.1 基本使用 3.2 同时监听多个变量 3.3 监听对象中属性某个属性的变化 3.4 监听对象中所有属性 4 纯数据字段…

【CSS】属性书写顺序

1.布局定位属性: display(元素类型建议第一个) position float(浮动) clear visibility overflow 2.自身属性: width height margin(外边距) …

我的内网渗透-Empire进阶(会话转移和剪贴板攻击)

剪贴版攻击 安装 下载网址 https://github.com/D4Vinci/PasteJacker 下载的两种方式 ①直接在windows中下载,然后解压完把文件夹传到kali中进行安装 ②只接在kali中下载 git clone https://github.com/D4Vinci/PasteJacker #下载压缩包unzip PasteJacker-maste…

C语言之运算符

C语言运算符 文末附运算符的优先表和ASCII表 一、算术运算符 加()减(—)乘(*)除(/)模(余)运算符(%):不允许出现浮点型,…

这是一颗经过计划生育的树?

🎈个人主页:🎈 :✨✨✨初阶牛✨✨✨ 🐻推荐专栏1: 🍔🍟🌯C语言初阶 🐻推荐专栏2: 🍔🍟🌯C语言进阶 🔑个人信条: 🌵知行合一 &#x1f…

Hadoop的shuffle过程及调优

MapReduce 中的Shuffle 发生在 map 输出到 reduce 输入的过程,它的中文解释是 “洗牌”,顾名思义该过程涉及数据的重新分配,主要分为两部分: map 任务输出的数据分组、排序,写入本地磁盘。reduce 任务拉取排序。 由于…

基于Java+Swing+Mysql实现人事管理信息系统

基于JavaSwingMysql实现人事管理信息系统 一、系统介绍二、功能展示1.用户登陆2.用户注册3.员工信息添加、删除4.员工信息查询、修改5.部门管理6、员工考核 三、数据库四、其它1.其他系统实现五.获取源码 一、系统介绍 系统功能:用户登陆、用户注册、员工信息添加、…

6.8object类equals tostring

2 什么是API API(Application Programming Interface,应用程序接口)是一些预先定义的函数。目的是提供应用程序与开发人员基于某软件可以访问的一些功能集,但又无需访问源码或理解内部工作机制的细节. API是一种通用功能集,有时公…

基于Java+Swing+Mysql实现旅游管理信息系统

基于JavaSwingMysql实现旅游管理信息系统 一、系统介绍二、功能展示1.登陆2.注册3.旅游信息查询4.查看游行团信息5.报名6、报名信息管理 三、数据库四、其它1.其他系统实现五.获取源码 一、系统介绍 用户:登陆、注册、旅游信息查询、查看游行团信息、报名 管理员&a…

【ARIMA-SSA-LSTM】合差分自回归移动平均方法-麻雀优化-长短期记忆神经网络研究(Python代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

数据库约束、表的关系

数据库约束、表的关系 数据库约束、表的关系 1. 数据库约束1.1 约束类型1.2 NULL约束1.3 UNIQUE:唯一约束1.4 DEFAULT:默认值约束1.5 PRIMARY KEY:主键约束1.6 FOREIGN KEY:外键约束 2. 表的设计2.1 一对一2.2 一对多2.3 多对多 …

ODOO16 ERP如何做标准的研发费用归集?

目前国家大力鼓励企业研发投入,并且给予很多鼓励。如《中共中央关于制定国民经济和社会发展第十四个五年规划和二〇三五年远景目标的建议》中明确提出:“发挥企业家在技术创新中的重要作用,鼓励企业加大研发投入,对企业投入基础研…

2023洗发护发市场分析(头皮清洁护理等新兴品类销售数据分析)

如今,随着人们消费观念的转变,对洗发护发相关用品的要求也逐渐提高,由原来单一的清洁功能到更注重洗发护发用品的功能及护理效果。因此,洗发护发产品的品类不断增加,洗发护发产品的市场规模也不断扩大,整体…

JAVA实现一个工作流引擎

介绍 工作流是一种将一系列相关的任务和活动组织起来的技术,以便在企业或组织中自动化或半自动化地管理业务流程。工作流技术可以帮助企业或组织更好地管理和优化业务流程,提高生产效率和质量,降低成本和风险。 JAVA作为一种面向对象编程语…

线程池与CompletableFuture 异步编排

使用线程池的好处: 1、降低资源的消耗 通过重复利用已经创建好的线程降低线程的创建和销毁带来的损耗 2、提高响应速度 因为线程池中的线程数没有超过线程池的最大上限时,有的线程处于等待分配任务 的状态,当任务来时无需创建新的线程就能执行…

STM32启动详细流程分析(一)

问题提出 大家不妨设想一下,cpu 的工作是什么,cpu 是没有主观意识的,它只会按照特定的指令执行相应的操作,用专业术语来说就是:取指 -> 译码 -> 执行,译码和执行肯定是在 cpu 内部进行操作的&#x…

MySQL数据库增删改查及聚合查询SQL语句学习汇总

目录 数据库增删改查SQL语句 MySQL数据库指令 1.查询数据库 2.创建数据库 3.删除数据库 4.选择数据库 创建表table 查看所有表 创建表 查看指定表的结构 删除表 数据库命令进行注释 增删改查(CRUD)详细说明 增加 SQL库提供了关于时间的…

Python 查询 DynamoDB

文章目录 DynamoDB 简介Boto3简介安装和导入 Boto3将 Boto3 连接到 DynamoDB 使用 Boto3 在 DynamoDB 中创建表通过 Boto3 删除 DynamoDB 中的表通过 Boto3 列出 DynamoDB 中的表通过 Boto3 在 DynamoDB 中分页通过 Boto3 在 DynamoDB 中排序通过 Boto3 在 DynamoDB 中获取项目…

【设计模式与范式:行为型】63 | 职责链模式(下):框架中常用的过滤器、拦截器是如何实现的?

上一节课,我们学习职责链模式的原理与实现,并且通过一个敏感词过滤框架的例子,展示了职责链模式的设计意图。本质上来说,它跟大部分设计模式一样,都是为了解耦代码,应对代码的复杂性,让代码满足…