mysql索引、事务、存储引擎

一、索引

索引的概念:

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

总结:索引就是能够使系统更快速查询信息的结构

索引的作用(副作用):

作用:

  1. 数据库利用各种快速定位技术,能够大大加快查询速率

  2. 当表很大或查询涉及到多个表时,可以成千上万倍地提高查询速度

  3. 可以降低数据库的IO成本,并且还可以降低数据库的排序成本

  4. 通过创建唯一性索引保证数据表数据的唯一性

  5. 可以加快表与表之间的连接

  6. 在使用分组和排序时,可大大减少分组和排序时间

副作用:

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

  2. 在插入和修改数据时要花费更多的时间,因为索引也要随之变

创建索引的原则依据:

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

索引的分类:

  • 普通索引:针对所有字段,没有特殊的需求和规则
  • 唯一性索引:针对唯一字段,仅允许出现一次空值
  • 组合索引:多列/多字段组合的形式的索引,按照排序的顺序,否则无效
  • 主键索引:针对唯一字段且不可为空,同时一张表只允许包含一个主键索引
  • 全文索引:varchar、char、text、blob、clob 检索内部信息来做字段的索引

创建索引:

  1. 创建索引并且指向索引的字段 创建索引的时候直接致电给index

  2. 修改表的字段来添加索引 alter修改表结构的时候 添加add 添加index

  3. 创建表直接创建索引

    ps:主键索引直接创建主键即可

普通索引:
① :create index 索引名 on 表名 (字段);
② :alter table 表名 add index 自取 (字段)
③ :create table 表名(id int not null,name varchar(5),index 索引名 (字段));
唯一索引:
① :create unique 索引名 on 表名 (字段);
② :alter table 表名 add unique 索引名(字段);
组合索引:
create table 表名(id int not null,name varchar(10),index 索引名 (字段1,字段2));
select 字段1 字段2 from 表名    #查询(查询时字段的顺序要和创建时一致,否则无效)

查询索引:

1、show create table 表名;
2、show index from 表名;
3、show index from 表名\G;   #竖向显示表的索引信息
4、show keys from 表名;
5、show keys from 表名\G;

删除索引:

1、直接删除索引: drop index 索引名 on 表名;
2、修改表的方式删除索引:alter table 表名 drop index 索引名;
3、删除主键索引:alter table 表名 drop primary key;

二、事务

  •  事务主要用于处理操作量大,复杂度高的数据
  • 事务是一种机制、一个操作序列,包含了一组数据库操作命令,并且把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么都执行,要么都不执行

  • 事务是一个不可分割的工作逻辑单元,在数据库系统上执行并发操作时,事务是最小的控制单元

  • 事务适用于多用户同时操作的数据库系统的场景,如银行、保险公司及证券交易系统等等

  • 事务是通过事务的整体性以保证数据的一致性

总结:所谓事务,是一个操作序列,这些操作要么都执行,要么都不执行

事务的ACID特点:

  • 原子性:指事务是一个不可再分割的工作单位,事务中的操作要么都发生,要么都不发生
  • 一致性:指在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏
  • 隔离性:指在并发环境中,当不同的事务同时操纵相同的数据时,每个事务都有各自的完整数据空间
  • 持久性:在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚

事务之间的影响

1、脏读:就是事务B读取了事务A没有提交的数据

没有提交的数据可能会发生rollback(回滚),

  • 比如事务B执行过程中修改了数据X,在未提交前,事务A读取了X,而事务B却回滚了,这样事务A就形成了脏读

2、不可重复读:前后读取的数据内容不一样的现象称为不可重复读
  • 事务A第一次查询得到一行记录row1,事务B提交修改后,事务A第二次查询得到row1,但列内容发生了变化。

3、幻读:事务B前后两次读取同一范围的数据,后一次读取总数和前一次不一致,称为幻读

4、丢失更新:事务A去撤销事务时,把已提交的事务B的更新数据覆盖,称为丢失更新

mysql事务隔离级别:

1、read uncommitted :安全性最差,但是性能最好 (不使用)

  • (读取尚未提交的数据 ,不解决脏读,允许脏读,其他事务只要修改了数未提交读)据,即使未提交,本事务也能看到修改后的数据值。也就是可能读取到其他会话中未提交事务修改的数据

2、read committed (提交读) :安全性较差,性能较好

  • 读取已经提交的数据 ,可以解决脏读只能读取到已经提交的数据。Oracle等多数数据库默认都是该级别(不重复读)

3、repeatable read (可重复度) :安全性较高,性能较差

  • 可以解决脏读 和 不可重复读 ,mysql默认的可重复读。无论其他事务是否修改并提交了数据,在这个事务中看到的数据值始终不受其他事务影响

4、serializable串行化 :安全性最高,性能最差(不使用)

  • 可以解决 脏读 不可重复读 和 虚读—相当于锁表完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞

mysql默认的事务处理级别是 repeatable read ,而Oracle和SQL Server是 read committed

事务隔离级别的作用范围分为两种:

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

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

查询全局事务隔离级别:
show global variables like '%isolation%';
select @@global.tx_isolation;设置全局事务隔离级别:
set global transaction isolation level read committed;查询会话事务隔离级别:
show session variables like '%isoation%';
select @@session.tx_isolation;
select @@tx_isolation;设置会话事务隔离级别
set session transaction isolation level read committed;

事务控制语句:

begin 或 start transaction:显式地开启一个事务
rollback 或 rollback work:回滚 返回结束数据的修改,返回修改之前的数据记录
commit 或 commit work:提交事务,并使已对数据库进行的所有修改变为永久性的
savepoint S1:创建一个回滚点,一个事务中可以有多个savepoint;S1代表回滚点名称
rollback to S1:把事务回滚到标记点使用 set 设置控制事务
SET AUTOCOMMIT=0;						#禁止自动提交
SET AUTOCOMMIT=1;						#开启自动提交,Mysql默认为1
SHOW VARIABLES LIKE 'AUTOCOMMIT';		#查看Mysql中的AUTOCOMMIT值
如果没有开启自动提交,当前会话连接的mysql的所有操作都会当成一个事务直到你输入rollback|commit;当前事务才算结束。当前事务结束前新的mysql连接时无法读取到任何当前会话的操作结果。
如果开起了自动提交,mysql会把每个sql语句当成一个事务,然后自动的commit

三、MySQL 存储引擎

存储引擎概念

  • MySQL中的数据用各种不同的技术存储在文件中,每一种技术都使用不同的存储机制、索引技巧、锁定水平并最终提供不同的功能和能力,这些不同的技术以及配套的功能在MySQL中称为存储引擎
  • 存储引擎是MySQL将数据存储在文件系统中的存储方式或者存储格式

MySQL常用的存储引擎:MyISAM 和 InnoDB

myisam:
  • MyISAM不支持事务,也不支持外键约束,只支持全文索引,数据文件和索引文件是分开保存的

  • 访问速度快,对事务完整性没有要求

  • MyISAM 适合查询、插入为主的应用场景

MyISAM在磁盘上存储成三个文件,文件名和表名都相同,但是扩展名分别为

  • .frm 文件存储表结构的定义
  • 数据文件的扩展名为 .MYD (MYData)
  • 索引文件的扩展名是 .MYI (MYIndex)
myisam表支持三种不同的存储格式:

1、静态表 (char):静态表时默认的存储格式,字段都是非可变字段

2、动态表 (varchar):包含可变字段,记录不是固定长度的

3、压缩表 (myisamchk):每个记录都是被独立压缩的,创一个表就会压缩

MyIsam 是表级锁定

读或写无法同时进行,好处是分开执行时,速度快、资源占用相对较少

Myisam:适合于单方向的任务场景、同时并发量不高、对于事务要求不高的场景

INNODB:

特点:支持事务,支持4个事务隔离级别

死锁:当两个请求分别访问/读取2行记录,同时又需要读取对方的记录数据,因为(行锁的限制)而造成了阻塞的现象

表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低;
行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高;

查看系统支持的存储引擎
show engines;查看表使用的存储引擎
方法一:
show table status from 库名 where name='表名'\G;
方法二:
use 库名;
show create table 表名;修改存储引擎
方法一:
通过 alter table 修改
use 库名;
alter table 表名 engine=MyISAM;
show create table 表名方法二:
通过修改 /etc/my.cnf 配置文件,指定默认存储引擎并重启服务
quit
vim /etc/my.cnf
[mysqld]
default-storage-engine=INNODB
systemctl restart mysqld.service
修改完记得重启mysql服务
#注意:此方法只对修改了配置文件并重启mysql服务后新创建的表有效,已经存在的表不会有变更。方法三:
通过 create table 创建表时指定存储引擎
use 库名;
create table 表名(字段1 数据类型,...) engine=MyISAM;例:mysql -u root -p
use SCHOOL;
create table hellolic (name varchar(10),age char(4)) engine=myisam;

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

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

相关文章

python的sort与sorted

一、sort 方法 sort 方法是列表的方法,用于在原地对列表进行排序,即直接修改原始列表,不返回新的列表。 它可以接受两个可选参数:key 和 reverse。 key 是一个函数,用于指定排序的依据; reverse 是一…

XSS检测工具XSStrike源码分析及使用记录

目录 ​编辑 官方说明 主要特点 参数 源码刨析 扫描模式 自带payload扫描

npm install 报错

npm install 报错 npm install 报错 npm ERR! code ERESOLVE npm ERR! ERESOLVE unable to resolve dependency tree npm ERR! npm ERR! While resolving: yudao-ui-admin1.8.0-snapshot npm ERR! Found: eslint7.15.0 npm ERR! node_modules/eslint npm ERR! dev eslint&q…

Greenplum实用技巧

一、通过gp_segment_id查看数据倾斜 gp_segment_id是表中的隐藏列,用来标记该行属于哪个segment节点。因此可以基于该隐藏列进行分组查询,获取每个segment的记录数,从而判断表数据的分布是否均匀或有倾斜。 qb#select gp_segment_id, count…

【js】Map遍历方法

Map 结构原生提供三个遍历器生成函数和一个遍历方法。 Map.prototype.keys():返回键名的遍历器。Map.prototype.values():返回键值的遍历器。Map.prototype.entries():返回所有成员的遍历器。Map.prototype.forEach():遍历 Map 的…

文本编辑器Vim常用操作和技巧

文章目录 1. Vim常用操作1.1 Vim简介1.2 Vim工作模式1.3 插入命令1.4 定位命令1.5 删除命令1.6 复制和剪切命令1.7 替换和取消命令1.8 搜索和搜索替换命令1.9 保存和退出命令 2. Vim使用技巧 1. Vim常用操作 1.1 Vim简介 Vim是一个功能强大的全屏幕文本编辑器,是L…

谷歌发布Gemini以5倍速击败GPT-4

在Covid疫情爆发之前,谷歌发布了MEENA模型,短时间内成为世界上最好的大型语言模型。谷歌发布的博客和论文非常可爱,因为它特别与OpenAI进行了比较。 相比于现有的最先进生成模型OpenAI GPT-2,MEENA的模型容量增加了1.7倍&#xf…

Java 数据结构使用学习

Set和List的区别 Set 接口实例存储的是无序的&#xff0c;不重复的数据。List 接口实例存储的是有序的&#xff0c;可以重复的元素。 Set 检索效率低下&#xff0c;删除和插入效率高&#xff0c;插入和删除不会引起元素位置改变 <实现类有HashSet,TreeSet>。 List 和数…

【LeetCode算法系列题解】第6~10题

CONTENTS LeetCode 6. N 字形变换&#xff08;中等&#xff09;LeetCode 7. 整数反转&#xff08;中等&#xff09;LeetCode 8. 字符串转换整数-atoi&#xff08;中等&#xff09;LeetCode 9. 回文数&#xff08;简单&#xff09;LeetCode 10. 正则表达式匹配&#xff08;困难&…

C# Linq源码分析之Take(四)

概要 本文主要对Take的优化方法进行源码分析&#xff0c;分析Take在配合Select&#xff0c;Where等常用的Linq扩展方法使用时候&#xff0c;如何实现优化处理。 本文涉及到Select, Where和Take和三个方法的源码分析&#xff0c;其中Select, Where, Take更详尽的源码分析&…

【日积月累】后端刷题日志

刷题日志 说说对Java的理解JAVA中抽象类和接口之间的区别Java中的泛型 和equals()的区别八种基本数据类型与他们的包装类在一个静态方法内调用一个非静态成员为什么是非法的静态方法与实例方法有何不同重载与重写深拷贝浅拷贝面向过程与面向对象成员变量与局部变量Spring框架Sp…

Spring Bean对象生命周期

文章目录 前言基础通俗理解bean作用域 前言 最近学习spring的一些基础概念&#xff0c;所以就先了解了bean对象的概念&#xff0c;而且发现这个里面涉及到很多的内容&#xff0c;比如在spring中一个bean对象是如何创建以及销毁的这些概念&#xff0c;所以就打算总结一些spring…

微信开发之一键踢出群聊的技术实现

简要描述&#xff1a; 删除群成员 请求URL&#xff1a; http://域名地址/deleteChatRoomMember 请求方式&#xff1a; POST 请求头Headers&#xff1a; Content-Type&#xff1a;application/jsonAuthorization&#xff1a;login接口返回 参数&#xff1a; 参数名必选…

SpringBoot之logback-spring.xml详细配置

《logback官网》 各种指导文件&#xff0c;有空自己去看&#xff0c;比如&#xff1a;我们需要调整的是布局&#xff0c;直接看Layouts。 pom.xml <!-- 环境配置 --><profiles><profile><id>dev</id><properties><spring.profiles.a…

基于java swing和mysql实现的汽车租赁管理系统(源码+数据库+文档+运行指导视频)

一、项目简介 本项目是一套基于java swing和mysql实现的汽车租赁管理系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、项目文档、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经…

面试题整理

数据结构与算法 快排 实现原理&#xff1f; 不快原地算法---什么意思&#xff1f; 快排的时间复杂度&#xff1f; 有序数组快排的时间复杂度和解决办法&#xff1f; 快排查找第K个最大元素&#xff1f; &#xff08;target_indexnum.size-k&#xff09; 归并 实现原理&…

麒麟系统上安装 MySQL 8.0.24

我介绍一下在麒麟系统上安装 MySQL 8.0.24 的详细步骤&#xff0c;前提是您已经下载了 mysql-8.0.24-linux-glibc2.12-x86_64.tar.xz 安装包。其实安装很简单&#xff0c;但是有坑&#xff0c;而且问题非常严重&#xff01;由于麒麟系统相关文章博客较少&#xff0c;导致遇到了…

java八股文面试[数据库]——MySql聚簇索引和非聚簇索引区别

聚集索引和非聚集索引 聚集索引和非聚集索引的根本区别是表记录的排列顺序和与索引的排列顺序是否一致。 1、聚集索引 聚集索引表记录的排列顺序和索引的排列顺序一致&#xff08;以InnoDB聚集索引的主键索引来说&#xff0c;叶子节点中存储的就是行数据&#xff0c;行数据在…

MFC -- Date Time Picker 控件使用

当前环境&#xff1a;VS2015 Windows 10 //&#xff08;一&#xff09;使用普通函数&#xff0c; 获取当前时间CString strCurrentTime; COleDateTime m_time COleDateTime::GetCurrentTime(); strCurrentTime m_time.Format(_T("%Y-%m-%d %H:%M:%S")); SetDlgIt…

linux的基础知识

touch命令 用于创建一个新的文件 语法touch linux路径 参数必填 cat命令 用于查看文件内容 语法cat linux路径 参数必填 more命令 用于查看文件&#xff0c;可翻页查看 语法more linux路径 使用空格进行翻下一页&#xff0c;b翻上一页&#xff0c;ent进行一行一行查看&…