MySQL索引、事务与存储引擎

数据库索引

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

索引的作用

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

1、加快表的查询速度 2、可以对字段进行排序

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

索引的副作用

  • 索引需要占用额外的磁盘空间

对于MyISAM引擎而言,索引文件和数据文件是分离的,索引文件用于保存数据记录的地址。

而InnoDB引擎的表数据文件本身就是索引文件。

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

创建索引的原则依据

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

  • 表的主键字段、外键字段必须有索引。因为主键具有唯一性,外键关联的是主表的主键,查询是可以快速定位。
  • 记录数超过300行的表应该有索引,如果没有索引,每次查询都需要把表遍历一遍,会严重影响数据库的性能。
  • 经常与其他表进行连接的表,在连接字段上应该建立索引。
  • 在经常出现where自己的字段,特别是大表的字段,应该建立索引
  • 在经常使用GROUP BY、ORDER BY的字段上建立索引
  • 索引应该建立在选择性高的字段
  • 索引应该建立在小字段,对于打的文字字段甚至超长字段,不需要索引。
  • 唯一性太差的字段不适合建立索引
  • 更新太频繁的字段不适合创建索引

表的主键字段、外键字段、多表链接字段、唯一性较好字段、不经常更新的字段、经常出现在where、group by、order by语句的字段、小字段

索引类型:

普通索引 create index 索引名 on 表名 (字段(LEN));

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

唯一索引 create unique 索引名 on 表名 (字段(LEN));

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

主键索引 alter table 表名 add primary key(字段)

组合索引 create index 索引名 on 表名(字段1,字段2,字段3...)

alter table 表名 add index 索引名 (字段1.字段2...);

select 查询时 where语句中的条件字段,要与组合索引的字段排列顺序一致(最左原则)

全文索引 create fulltext index 索引名 on 表名(字段);

alter table 表名 add fulltext 索引名(字段);

select 字段 from 表 where match (字段) against (‘查询内容’); #模糊查询

(1)普通索引

  • 直接创建索引

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

#(列名(length)):length是可选项。如果忽略length的值,则使用整个列的值作为索引。如果指定,使用列的前length个字符来创建索引,这样有利于减小索引文件大小。在不损失精确性的情况下,长度越短越好。

#索引名建议以“_index”结尾

  • 修改表方式创建索引

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

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

  • 直接创建唯一索引

CREATE UNIQUE INDEX CARDID_INDEX ON MEMBER(CARDID);

  • 修改表方式创建

ALTER TABLE MEMBER1 ADD UNIQUE PHONE_INDEX(PHONE);

(3)主键索引:是一种特殊的唯一索引,必须指定为“PRIMARY KEY”。一个表只能有一个主键,不允许有空值。添加主键将自动创建主键索引。

  • 创建表的时候指定

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

  • 修改表方式创建

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

  • 删除索引

DROP INDEX NAME_INDEX ON MEMBER;

ALTER TABLE MEMBER DROP INDEX PHONE_INDEX;

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

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

ALTER TABLE MEMBER ADD INDEX NAME_CARDID_PHONE_INDEX('NAME','CARDID','PHONE');

查询时顺序也要保持一致:SELECT * FROM WHERE NAME='' AND CARDID='' AND PHONE=''

(5)全文索引(FULLTEXT):适合在进行模糊查询的时候使用,可用于在一篇文章中检索文本信息。全文索引可以在CAHR/VARCHAR或者TEXT类型的列上。

  • 直接创建

CREATE FULLTEXT INDEX REMARK_INDEX ON MEMBER (REMARK);

  • 修改表方式创建

ALTER TABLE MEMBER1 ADD FULLTEXT REMARK_INDEX (REMARK)

使用全文索引查询

SELECT * FROM 表名 WHERE MATCH (REMARK)

模糊查询

SELECT * FROM 表名 WHERE MATCH (REMARK)

查看索引

SHOW INDEX FROM MEMBER1\G

SHOW KEYS FROM MEMBER1\G

Table:表的名称

Non_unique:如果缩印不能包括重复词,则为0;如果可以,则为1

Seq_in_index:索引中的列序号,从1开始

column_name:列名称

collation:列以什么方式存储在索引中。在MySQL中,有值‘A’(升序)或NULL(无分类)

cardinality:索引中唯一值数目的估计值

sub_part: 如果类只是被部分的编入索引的字符的数目。如果整列被编入索引,则为NULL

packed:指示关键字如何被压缩。如果没有被压缩,则为NULL

Null:如果列含有NULL,则含有YES

EXPLAIN分析优化,显示了MySQL如何使用索引

explain select * from ‘EXAM_RESULT_SKILL_72’ where ‘USER_ID’=12233

分析MySQL加载速度慢:网络慢 (ping延迟,抓包看是否丢包) 系统性能原因 (CPU、I/O)、服务本身问题(优化配置文件:增加缓存、连接数)、语法问题、没有用索引

MySQL事务

  • 事务是一种机制、一个操作序列,包含了一组数据库操作命令,并且把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么都执行,要么都不执行。
  • 是一个不可分割的工作逻辑单元,在数据库系统上执行并发操作时,事物是最小的控制单元
  • 事务适用与多个用户同时操作的数据库系统场景,如:银行保险工作
  • 事务通过事务的整体性以保证数据的一致性。
  • 事务能够提高在向表中更新和插入信息期间的可靠性。

说白了,所谓事务,他就是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。

事务的ACID的特点

ACID是指在可靠数据库管理系统DBMS中,事务(transaction)应该具有的四个特性:原子性(Atomicity)、一致性(consistency)、隔离性(Isolation)、持久性(Durability)

原子性:

  • 指事务是一个不可再分割的工作单位,事务中的操作要么都发生,要么都不发生
  • 事务是一个完整的操作,事物的各个元素是不可分的
  • 事务中的所有元素必须作为一个整体提交或回滚。
  • 如果事务中的任何元素失败,则整个事务将失败。

一致性:

  • 指在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。
  • 当事务完成时,数据必须处于一致状态。
  • 在事务开始前,数据库中存储的数据处于一致状态。
  • 在正在进行的事务中,数据可能处于不一致的状态。
  • 当事务成功完成时,数据必须再次回到已知的一致状态。

隔离性:

  • 指在并发环境中,当不同的事务同时操纵相同的数据时,每个事务都有各自的完整数据空间。
  • 对数据进行修改的所有并发事务是彼此隔离的,表名事务必须是独立的,它不应以任何方式依赖于或影响其他事务。
  • 修改数据的事务可在另一个使用相同数据的事务开始之前访问这些数据,或者在另一个使用相同数据的事务结束之后访问这些数据。
  • 也就是说并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事物之间和数据库是独立的。

当第一个客户端并发访问同一个表时,可能会出现一致性问题:

脏读:当一个事务正在访问数据,并且对数据进行了修改,并且这修改还未提交到到数据库中,这时,另外一个事务也访问了这个数据,然后使用了这个数据。

不可重复读:指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务的两次读取之间,由干第一个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样就发生了在一个事务两次读到的数据是不一样的,因此称为是不可重复读。

幻读:一个事各对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,另一个事务也修改这个表中的数据。这种修改是向表中插入一行新数据。那么,操作前一个事务的用户会发现表中还有一个没有修改的数据行,就好象发生了幻觉一样

丢失更新:两个事务同时读取同一条记录,A先修改记录,B也修改记录(B不知道A修改过),B提交数据后B的修改结果覆盖了A的修改结果。

//事务的隔离级别决定了事物之间可见的级别。

MySQL事务支持如下四种隔离,用以控制事务所做的修改,并将修改通告至其他并发的事务:

(1) 未提交读(Read ncommitted (Ru) ):允许脏读,即允许一个事务可以看到其他事务未提交的修改。

(2) 提交读(Read Committed (RC) ):允许一个事务只能看到其他事务已经提交的修改,未提交的修改是不可见的。防止脏读。

(3) 可重复读(Repeatable Read(RR) ): ---mysql默认的隔离级别

确保如果在一个事务中执行两次相同的SELECT语句,都能得到相同的结果,不管其他事务是否提交这些修改。可以防止脏读和不可重复读。

(4) 串行读(Serializable):---相当于锁表

完全串行化的读,将一个事务与其他事务完全地隔离。每次读都需要获得表级共享锁,读写相互都会阳塞。可以防止脏读,不可重复读取和幻读,(事务串行化)会降低数据库的效率。

mysql默认的事务处理级别是 repeatable read ,而oracle和sOL Server是 read committed。

//事务隔离结的作用范围分为两种:

全局级:对所有的会话有效

会话级:只对当前的会话有效

查询会话事务隔离级别:

show global variables like '%isolation%';

select @@global.tx_isolation;

修改运行级别

set global transaction isolation level read uncommitted;

mysql>begin; #开始事务

mysql>rollback; #撤回,回滚

mysql>commit; #提交操作

持久性:

在事务完成以后,该事务所对数据库所做的更改便持久的保存在数据库之中,并不会被回滚。

指不管系统是否发生故障,事务处理的结果都是永久的。

一旦事务被提交,事物的结果就会被永久的保留在数据库中。

总结:在事务管理中,原子性是基础,隔离性是手段,一致性是目的,持久性是结果。

事务控制语句

  • BEGIN 或 START TRANSACTION:显式地开启一个事务
  • COMMIT 或 COMMIT WORK:提交事务,并使以对数据库进行的所有修改变为永久性的。
  • ROLLBACK 或 ROLLBACK WORK: 当前事务结束,并且撤销正在进行的所有未提交的修改
  • SAVEPOINT S1; 或 SAVEPOINT 允许在事务中创建一个回滚点,一个事物可以有多个SAVAPOINT

ROLLBACK TO S1; #事务没有结束

show variables like 'autocommit'; 数据库自动提交

set autocommit=0; 关闭自动提交

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

IS210AEBIH3BEC隔离器用于变压器等高压设备

IS210AEBIH3BEC隔离器用于变压器等高压设备 隔离器可以根据在电力系统中的位置进行分类 母线侧隔离器——隔离器直接连接到主母线线路侧隔离器 - 隔离器将放置在任何馈线的线路侧Transfer bus side isolator – isolator will be directly connected with the transfer bus S…

【LeetCode】1143. 最长公共子序列

1.问题 给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。 一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符&#xff0…

怎么让chatGTP写论文-chatGTP写论文工具

chatGTP如何写论文 ChatGPT是一个使用深度学习技术训练的自然语言处理模型,可以用于生成自然语言文本,例如对话、摘要、文章等。作为一个人工智能技术,ChatGPT可以帮助你处理一些文字内容,但并不能代替人类的创造性思考和判断。以…

手机录屏怎么操作?有哪些好用的方法

在现代科技的时代,手机录屏已经成为了常见的操作。这项技术允许我们在手机上录制视频并分享给他人。但是,很多人可能并不知道如何进行手机录屏。下面我们将介绍手机录屏的操作方法和一些值得推荐的工具。 手机录屏操作方法 对于iOS用户,可以…

Ribbon负载均衡

目录 1.Ribbon负载均衡 1.1.负载均衡原理 1.2.源码跟踪 1)LoadBalancerIntercepor 2)LoadBalancerClient 3)负载均衡策略IRule 4)总结 1.3.负载均衡策略 1.3.1.负载均衡策略 1.3.2.自定义负载均衡策略 1.4.饥饿加载 1.R…

InnoDB 与MyISAM 的区别

MyISAM和InnoDB都是Mysql里面的两个存储引擎。 在Mysql里面,存储引擎是可以自己扩展的,它的本质其实是定义数据存储的方式以及数据读取的实现逻辑。 不同存储引擎本身的特性,使得我们可以针对性的选择合适的引擎来实现不同的业务场景。从而获…

Java企业级信息系统开发01—采用spring配置文件管理bean

文章目录 一、Web开发技术二、spring框架(一)spring官网(二)spring框架优点(三)Spring框架核心概念1、IoC(Inversion of Control)和容器2、AOP(Aspect-Oriented Programm…

间谍软件开发商利用漏洞利用链攻击移动生态系统

导语:间谍软件开发商结合使用了零日漏洞和已知漏洞。谷歌TAG的研究人员督促厂商和用户应加快给移动设备打补丁的步伐。 间谍软件开发商利用漏洞利用链攻击移动生态系统去年,几家商业间谍软件开发商开发并利用了针对 iOS 和安卓用户的零日漏洞。然而&…

【Python】什么是爬虫,爬虫实例

有s表示加密的访问方式 一、初识爬虫 什么是爬虫 网络爬虫,是一种按照一定规则,自动抓取互联网信息的程序或者脚本。由于互联网数据的多样性和资源的有限性,根据用户需求定向抓取相关网页并分析已成为如今主流的爬取策略爬虫可以做什么 你可以…

stream的collectors

起因的话&#xff0c;新进公司&#xff0c;看见了一段有意思的代码。 public final class MyCollectors {private MyCollectors() {}static final Set<Collector.Characteristics> CH_ID Collections.unmodifiableSet(EnumSet.of(Collector.Characteristics.IDENTITY_F…

从点赞到数字货币:揭秘Diem币与Facebook的联系

大家都知道Facebook是一个全球知名的社交媒体平台&#xff0c;但你是否听说过与Facebook有关的数字货币Diem币呢&#xff1f;或许你会想&#xff0c;从点赞到数字货币&#xff0c;这是怎么回事&#xff1f;别着急&#xff0c;让我们一起揭秘Diem币与Facebook的联系。 首先&…

rk平台调试音频(从驱动到apk)

需要实现的功能&#xff1a; 输入&#xff1a;hdmiin、uvc、mic可以实时切换 输出&#xff1a;耳机和HDMI OUT同时输出声音 这里注意&#xff1a;mic是存在hedset情况&#xff0c;4节耳机&#xff0c;即可输出又可输出同时进行 开发情况&#xff1a; 一、先熟悉大致的Andro…

ArcMap最短路径分析和网络数据集的构建

打断相交点 1.单击【编辑器】工具条上的编辑工具。 2.选择要在交叉点处进行分割的线要素。 3.单击【高级编辑】工具条上的打断相交线工具。 4.默认或可输入拓扑容差。 5.单击确定。 结果:所选线在相交处分割为多个新要素。“打断”操作还会移除叠置的线段-例如&#xff0…

怎么控制别人的电脑屏幕?

为什么需要控制别人的屏幕&#xff1f; 我们不可避免地会遇到一些情况&#xff0c;比如我们需要为我们的朋友、同事或家人提供有关 IT 相关问题的帮助&#xff0c;如果他们不知道它该怎么处理这些问题该怎么办呢&#xff1f; 这时&#xff0c;我们可能需要用我们的电脑…

测试20K要什么水平?25岁测试工程师成功斩下offer(附面试题)

年少不懂面试经&#xff0c;读懂已是测试人。 大家好&#xff0c;我是一名历经沧桑&#xff0c;看透互联网行业百态的测试从业者&#xff0c;经过数年的勤学苦练&#xff0c;精钻深研究&#xff0c;终于从初出茅庐的职场新手成长为现在的测试老鸟&#xff0c;早已看透了面试官…

三维数据学习笔记:ply数据内容介绍

目录 前言1. 三维数据的组成1.1 点云数据1.2 网格数据 2. ply数据内容2.1 属性2.1.1 文本描述属性2.1.2 数据描述属性2.1.2.1 顶点(vertex)2.1.2.2 面(face)2.1.2.3 相机(camera) 2.2 数据2.2.1 顶点(vertex)2.2.2 面(face)2.2.3 相机(camera) 3. 示例3.1 示例13.2 示例2 前言 …

Java基础(十七)File类与IO流

1. java.io.File类的使用 1.1 概述 File类及本章下的各种流&#xff0c;都定义在java.io包下。一个File对象代表硬盘或网络中可能存在的一个文件或者文件目录&#xff08;俗称文件夹&#xff09;&#xff0c;与平台无关。&#xff08;体会万事万物皆对象&#xff09;File 能新…

JDK17新特性之--JDK9到JDK17 String 新增的新方法

JDK9之后对String底层存储数据结构进行了重大的修改1&#xff0c;同步也增加了许多新的方法&#xff0c;主要有Text Blocks、chars()、codePoints()、describeConstable()、formatted()、indent()、isBlank()、isEmpty()、lines()、repeat()、strip()、stripLeading()、stripIn…

DolphinScheduler 3.1.4详细教程

文章目录 第一章 DolphinScheduler介绍1.1 关于DolphinScheduler1.2 特性1.3 名词解释1.3.1 名词解释1.3.2 模块介绍 第二章 DolphinScheduler系统架构2.1 系统架构图2.2 架构说明该服务包含&#xff1a; 2.3 启动流程活动图2.4 架构设计思想2.4.1 去中心化vs中心化2.4.1.1 中心…

北京地铁:充分发挥数据价值,全面提升业财融合能力

4月19日-4月21日&#xff0c;一年一度的用友BIP技术大会圆满召开。来自行业领先企业的CIO/CDO、生态伙伴、开发者、分析师、媒体等共聚北京用友产业园&#xff0c;了解最新技术发展趋势、探讨行业热点话题。会上&#xff0c;北京地铁运营有限公司&#xff08;以下简称“北京地铁…