【数据库三】MySQL索引

news2024/11/23 21:24:04

MySQL索引、事务与存储引擎

  • 1.MySQL索引
    • 1.1 索引的概念
    • 1.2 索引的作用​
    • 1.3 索引的副作用​
    • 1.4 创建索引的原则依据​
  • 2.索引的分类和创建
    • 2.1 普通索引
    • 2.2 唯一索引
    • 2.3 主键索引
    • 2.4 组合索引
    • 2.5 全文索引
  • 3. 查看索引
  • 4.删除索引
  • 5. 知识点总结

1.MySQL索引

1.1 索引的概念

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

1.2 索引的作用​

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

1.3 索引的副作用​

  • 索引需要占用额外的磁盘空间
  • 对于MyISAM引擎而言,索引文件和数据文件是分离的,索引文件用于保存数据记录的地址
  • 而InnoDB引擎的表数据文件本身就是索引文件
  • 更新一个包含索引的表,需要比更新一个没有索引的表花费更多的时间,这是由于索引本身也需要更新。因此,理想的做法是仅仅在常常被搜素的列(以及表)上面创建索引

1.4 创建索引的原则依据​

索引虽可以提升数据库查询的速度,但并不是任何情况下都适合创建索引。因为索引本身会消耗系统资源,在有索引的情况下,数据库会先进行索引查询,然后定位到具体的数据行如果索引使用不当,反而会增加数据库的负担

(1)表的主键、外键必须有索引。因为主键具有唯一性,外键关联的是主表的主键,查询时可以快速定位
(2)记录数超过300行的表应该有索引。如果没有索引,每次查询都需要把表遍历一遍,会严重影响数据库的性能。
(3)经常与其他表进行连接的表,在连接字段上应该建立索引
(4)唯一性太差的字段不适合建立索引
(5)更新太频繁地字段不适合创建索引
(6)经常出现在where子句中的字段,特别是大表的字段,应该建立索引
(7)索引应该建在选择性高(冗余度低)的字段上
(8)索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引。

总结: MySQL的优化哪些字段/场景适合创建索引,哪些不适合?

①小字段 ②唯一性强的字段 ③更新不频繁,但查询率很高的字段 ④表记录超过300+行 ⑤主、外键、唯一键.

2.索引的分类和创建

创建模板

mysql -uroot -p123
create database gzy;
use gzy;
create table clr (id int(10),name varchar(10),cardid varchar(18),phone varchar(11), address varchar(50),remark text);

desc clr;
insert into clr values (1,'zhangsan','123','111111', 'nanjing','this is vip');
insert into clr values (2,'lisi','1234','444444','nanjing','this is normal');
select * from clr;

2.1 普通索引

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

(1)直接创建索引

create index 索引名 on 表名(列名[ ( length) ]);
  • (列名(length) ): length是可选项。如果忽略length的值,则使用整个列的值作为索引。如果指定使用列前的length个字符来创建索引,这样有利于减小索引文件的大小。在不损失精确性的情况下,长度越短越好
  • 索引名建议以"index”结尾。
    例如:
create index name_index on clr(name(4));
show create table clr;

(2)修改表方式创建

alter table 表名 add index 索引名 (列名);

例如:

alter table clr add index index_cardid (cardid);

(3)创建表的时候指定索引

create table 表名 ( 字段1 数据类型,字段2 数据类型,[...],index 索引名 (列名));

例如:

create table xiaocai (id int,name char(4),index index_id(id));

2.2 唯一索引

与普通索引类似,但区别是唯一索引列的每个值都唯一唯一索引允许有空值(注意和主键不同)。如果是用组合索引创建,则列值的组合必须唯一。添加唯一键将自动创建唯一索引

(1)直接创建唯一索引

create unique index 索引名 on 表名(列名);

例如:

create unique index phone_index on clr(phone);

(2)修改表方式创建

alter table 表名 add unique 索引名 (列名);

例如:

alter table clr add unique remark
_index (phone);

(3)创建表的时候指定

create table 表名 (字段1 数据类型,字段2 数据类型,[...],unique 索引名 (列名)); 

例如:

create table xiaoxiao (id int(4),name char(4),unique id_index(id))

2.3 主键索引

是一种特殊的唯一索引,必须指定为==‘‘PRIMARY KEY’’==。一个表只能有一个主键,不允许有空值添加主键将自动创建主键索引
(1)创建表的时候指定

create table 表名 ([...],primary key (列名));

例如:

create table xiao (id int,name char(4),primary key(id));

(2)修改表方式创建

alter table 表名 add primary key (列名); 

例如:

alter table xiaoxiao add primary key (id);

2.4 组合索引

(单列索引与多列索引):可以是单列上创建的索引,也可以是在多列上创建的索引。需要满足最左原则,因为select语句的where条件是依次从左往右执行的,所以在使用select语句查询时,where条件使用的字段顺序必须和组合索引中的排序一致,否则索引将不会生效。

总结: 组合索引创建的字段顺序是其触发索引的查询顺序

create table 表名 (列名1 数据类型,列名2 数据类型,列名3 数据类型,index 索引名 (列名1,列名2,列名3));

例如:

 alter table clr add index index_id_name(id,name);
select id,name from clr;    #按照创建的字段,则会触发组合索引
select name,id from clr;  #按照索引从左到右检索的顺序,则不会触发组合索引

2.5 全文索引

(fulltext)适合在进行模糊查询的时候使用,可用于在一篇文章中检索文本信息。在 MySQL5.6版本以前FULLTEXT索引仅可用于MyISAM引擎,在5.6版本之后innodb引擎也支持fulltext索引。全文索引可以在char、vaechar或者text类型的列上创建
(1)直接创建索引

create fulltext index 索引名 on 表名 (列名);

例如:

create fulltext index name_index on clr (name);

(2)修改表方式创建

alter table 表名 add fulltext 索引名 (列名);

例如:

alter table clr add fulltext cardid_index(cardid);

(3)创建表的时候指定索引

create table 表名 (字段1 数据类型,[...],fulltext 索引名 (列名));
#数据类型可以为char、varchar或者text

例如:

create table gao (id int,name varchar(4),fulltext name_index(name));

(4)使用全文索引查询

select * from 表名 where match(列名) against('查询内容');

例如:

select * from clr where match(name) against('zhangsan')

3. 查看索引

show create table 表名;
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用过的索引方法(BTREE, FULLTEXT, HASH, RTREE)
Comment备注

4.删除索引

(1)直接删除索引

drop index 索引名 on 表名;

例如:

drop index name_index on clr;

(2)修改表方式删除索引

alter table 表名 drop index 索引名;

例如:

alter table clr drop index cardid_index;

(3)删除主键索引

alter table 表名 drop primary key;

例如:

alter table clr drop primary key;

5. 知识点总结

索引

索引是一个排序的列表,包含索引字段的值和其相对应的行数据所在的物理地址.

作用: 加快表的查询速度,还可以对字段排序.

索引如何实现加快表的查询速度的?

  • 没有索引的情况下,要查询某行数据,需要先扫描全表来定位某行数据.
  • 有索引后,会通过查找条件的字段值找到其索引对应的行数据的物理地址,然后根据物理地址访问相应的数据.
    副作用: 会额外占用磁盘空间,更新包含索引的表效率会更慢.

创建索引的依据:

(1)表中的记录行数较多时,一般超过300行的表.
(2)表中的主键字段外键字段多表连接使用的字段唯一性较好的字段不经常更新的字段、经常出现在where、 group by、 order by子语句的字段、小字段.

(3)不建议在唯一性较差的字段、更新太频繁的字段、大文本字段上创建索引.

索引类型:

普通索引

create index 索引名 on 表名 (字段);       
alter table 表名 add index 索引名 (字段);

唯一索引

create unique index 索引名 on 表名 (字段);   
alter table 表名 add unique 索引名 (字段);

主键索引

 alter table 表名 add primary key (字段);

组合索引

create table index 索引名 on 表名 (字段1, 字段2, 字段3);  
alter table 表名 add index 索引名 (字段1, 字段2, 字段3);
select ... from 表名 where 字段1=XX and 字段2=xx and 字段3=XX     
#用and做条件逻辑运算符时,要创建组合索引且要满足最左原则
#用or做条件逻辑运算符时,所有字段都要创建索引 

全文索引

create fulltext index 索引名 on 表名 (字段);       
alter table 表名 add fulltext 索引名 (字段);
#模糊查询: 
select ... from 表名 where match(字段) against('查询内容');

查看索引

show create table 表名;
show index from 表名;
show keys from 表名;

删除索引

drop index 索引名 on 表名;
alter table 表名 drop 索引名;
alter table 表名 drop primary key;

索引优化查询速度

explain select ... 可以用于分析select查询语句,看key字段,确定是否使用了索引或索引使用是否正确

在这里插入图片描述

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

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

相关文章

基于html+css的图展示127

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

Unity光照贴图的切换,实现黑夜和白天效果

有这么一个需求,不能使用实时光来进行动态控制光照开关,但是又要实现白天和黑夜的效果,我的场景中有大概十几个点光源和平行光 实现步骤: 一、模型原模原样复制到另一个场景中(因为贴图只能存在于当前的场景文件夹&am…

618私藏好物推荐!看这份清单就够了!

又到了一年一度的618,相信大家的购物车已经堆得满满的, 部分人已经选好了自己想要的东西,但也有一部分人还在纠结自己到底应该买什么。今天就给大家分享我的618私藏好物, 如果你想在这个夏天买到自己心仪的好物,建议你…

IIC总线 测温度和湿度

iic.c #include "iic.h"extern void printf(const char* fmt, ...); /** 函数名 : delay_us* 函数功能:延时函数* 函数参数:无* 函数返回值:无* */ void delay_us(void) {unsigned int i 2000;while(i--); } /** 函数…

字符设备驱动的内部实现

1.inode号的功能 :①inode号是文件存在于文件系统的唯一标识1 ②同时也是索引当前文件的inode结构体的索引导 2.文件信息结构体:只要文件存在于文件系统中,那么内核中一定会存在一个struct inode结构体,这个结构体里面存放了文件…

详解Http的Content-Type

目录 1.概述 2.常用类型 2.1.application/x-www-form-urllencoded 2.2.application/json 3.Spring MVC支持的编码 3.1.实验 3.2.适配器 3.3.自定义适配器 1.概述 HTTP(HyperText Transfer Protocol),超文本传输协议。超文本&#xf…

从redis-trib.rb到集群加减节点实战

redis-trib.rb工具介绍 redis-trib.rb是redis集群管理工具,可以检查集群、创建删除节点、挪key、批量下发实例命令等等。 不是没有redis-trib.rb就没有集群管理了,没有redis-trib.rb照样可以管理集群。redis本身就有集群相关管理命令,redis-…

2021年系统架构设计师考试下午案例分析真题

试题一 阅读以下关于软件架构设计与评估的叙述,在答题纸上回答问题1和问题2。 [说明] 某公司拟开发-套机器学习应用开发平台,支持用户使用浏览器在线进行基于机器学习的智能应用开发活动。 该评台的核心应用场景是用户通过拖拽算法组件灵活定义机器学习流程&#…

“6511”成果显著,联诚发上半年表现企稳高升!

六场巡回演唱会,五大知名展会,一部爆款大电影,一项省级品牌荣誉。 这些关键词,是联诚发(LCF)在短短六个月内取得的各项成果的总览。 ▲联诚发LCF 公司简介 绿树阴浓夏日长,6月的到来也预示着阶…

让小脚本成为自己高效测试的工具(详细版)

目录 测试中会遇到的工具 测试常用的开源工具 Python 移动/UI自动化测试平台 平台需要做什么 自建需要的技术 接口测试平台 运维 Django运维部署框架 单元测试概述 什么是单元测试 单元测试什么进行? 单元测试由谁负责? 单元测试需要注意 …

opencv祛除高光

代码是直接借鉴的Opencv去除高光_SkyrimDragonBorn的博客-CSDN博客 原博客是c,我这边只是使用python进行翻译了一下 import cv2 import numpy as npimg cv2.imread(xxx.jpg)def highlight_remove(img):img cv2.cvtColor(img, cv2.COLOR_BGR2RGB).astype(np.floa…

java0615

01java语言背景介绍 02java语言跨平台原理 03JRE和JDK

View UI Plus (iview)表格单选实现教程

View UI Plus 是 View Design 设计体系中基于 Vue.js 3 的一套 UI 组件库,主要用于企业级中后台系统 View UI,即原先的 iView,从 2019 年 10 月起正式更名为 View UI,并使用全新的 Logo View UI Plus 实现表格单选,这…

八股文总结

文章目录 项目介绍1.不动产项目项目难点机器学习算法调研图像提取算法调研数据集-ImageNetXceptionVGGInceptionDensenetMobilenet 系统流程图 2.图书项目技术栈ShiroMybatisMyBatis:Mybatis Plus: 面试问题 Java基础基本数据类型反射接口和抽象类异常代理模式1. 静态代理2. 动…

Java Logback日志框架概述及logback.xml详解

日志技术具备的优势 可以将系统执行的信息选择性的记录到指定的位置(控制台、文件中、数据库中)。 可以随时以开关的形式控制是否记录日志,无需修改源代码。 日志体系结构 Logback日志框架 Logback是由log4j创始人设计的另一个开源日志组件&#xff0…

Android classLoader 双亲委托 反射

双亲委托 双亲委托机制,就是导入类的时候判断parent是否已经导入过该类。 作用 1、避免重复加载,当父加载器已经加载了该类的时候,没有必要子ClassLoader再加载一次。 2、安全性考虑,防止核心API库被随意篡改。 核心代码 pri…

CSS查缺补漏之常用长度单位(px、em、rem、%、vw/vh、vmin/vmax)

此文内容较少,轻轻松松掌握,莫要有压力~ 正如现实生活中长度具有mm、dm、cm、m等,在css中,也具备多种长度单位,本文对常用的几种单位进行详细举例介绍~ px:像素单位 初学css时,px单位经常被使用…

2023-06-16 Android Studio 使用CMakeList编译JNI ,源码

一、代码结构图,代码路径https://download.csdn.net/download/qq_37858386/87913001 二、cmakedemo\app\build.gradle 加下面的代码 externalNativeBuild {cmake {cppFlags "-frtti -fexceptions"}}externalNativeBuild {cmake {path src/main/jni/CMakeL…

邮件触发无需代码连接维格表的方法

1.邮件触发用户使用场景: 公司时常会收到来自各地的合作邮件,为了筛选合适的合作伙伴,公司需要查询对方企业的基础工商信息,例如企业的存续状态、法人代表、注册资金等等,然后将查询后的信息发送至高管群里&#xff0c…

使用docker部署ELK实战

目录 什么是ELKELK简介ElasticsearchLogstashKibana docker安装ELK安装es安装 Kibana安装logstash 什么是ELK ELK是一个开源的数据分析平台,由三个开源项目Elasticsearch、Logstash和Kibana组成,因此被称为ELK Stack。ELK Stack主要用于处理和分析大量的…