当前位置: 首页 > news >正文

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;

相关文章:

mysql索引、事务、存储引擎

一、索引 索引的概念: 索引是一个排序的列表,在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址(类似于C语言的链表通过指针指向数据记录的内存地址)。使用索引后可以不用扫描全表来定位某行的数据,而是…...

【CMU15445】Fall 2019, Project 2: Hash Table 实验记录

目录 实验准备实验测试 实验准备 官方说明:https://15445.courses.cs.cmu.edu/fall2019/project2/ 实验测试 Task 1: mkdir build cd build make hash_table_page_test ./test/hash_table_page_testTask 2: make hash_table_test ./test…...

PMP证书是不是烂大街了?

大家都知道,PMP证书是项目管理领域的金字招牌。近年来,随着项目管理的重要性日益凸显,越来越多的人开始关注和学习PMP证书。无论是企业招聘还是个人职业发展,PMP证书都成为了一张炙手可热的敲门砖。 那么,PMP证书到底…...

Mac下Docker Desktop安装命令行工具、开启本地远程访问

Mac系统下,为了方便在terminal和idea里使用docker,需要安装docker命令行工具,和开启Docker Desktop本地远程访问。 具体方法是在设置-高级下, 1.将勾选的User调整为System,这样不用手动配置PATH即可使用docker命令 …...

Java实现根据商品ID获取京东商品详情数据,1688商品详情接口,1688API接口封装方法

要通过京东的API获取商品详情数据,您可以使用京东开放平台提供的接口来实现。以下是一种使用Java编程语言实现的示例,展示如何通过京东开放平台API获取商品详情: 首先,确保您已注册成为京东开放平台的开发者,并创建一…...

element-plus指定el-date-picker的弹出框位置

此处记录一下,通过popper-options指定popper出现的位置...

游戏陪玩语音聊天系统3.0商业升级独立版本源码

首发价值29800元的最新商业版游戏陪玩语音聊天系统3.0商业升级独立版本源码 1、增加人气店员轮播 2、优化ui界面丨优化游戏图标展示丨优化分类展示 3、增加动态礼物打赏功能 4、增加礼物墙功能 增加店员满足业绩,才能升级功能 5、增加店员等级不同,…...

TCP/IP网络江湖武艺传承:物理层与通信江湖的幕后(物理层中篇:物理层与现代通信技术)

目录 〇、引言:进入现代通信技术的江湖 一、数字信号与模拟信号:传承与差异...

Nuxt 菜鸟入门学习笔记三:视图

文章目录 入口文件组件 Components页面 Pages布局 Layouts Nuxt 官网地址: https://nuxt.com/ Nuxt 提供多个组件层来实现应用程序的用户界面。 入口文件 App.vue组件 Components页面 Pages布局 Layouts 下面逐一进行介绍。 入口文件 默认情况下,Nu…...

Python Opencv实践 - 霍夫线检测(Hough Lines)

import cv2 as cv import numpy as np import matplotlib.pyplot as plt import randomimg cv.imread("../SampleImages/GreenBoard.jpg") print(img.shape) plt.imshow(img[:,:,::-1])#将图像转为二值图 gray cv.cvtColor(img, cv.COLOR_BGR2GRAY) plt.imshow(gra…...

Weblogic漏洞(四)之 CVE-2018-2894 任意文件上传漏洞

CVE-2018-2894 任意文件上传漏洞 漏洞影响 Weblogic受影响的版本: 10.3.6.012.1.3.012.2.1.212.2.1.3 漏洞环境 此次我们使用的是vnlhub靶场搭建的环境,是vnlhub中的Weblogic漏洞中的CVE-2018-2894靶场,我们 cd 到 CVE-2018-2894&#x…...

C++:string的[ ],at,push_back

1.[ ]运算符和at函数 返回的是string的当前字符串的合法的索引位置的引用,所谓的合法是指小于size的索引 #include <string> #include <iostream>using namespace std;int main() {string str = "hello";cout<<"str:"<<str<…...

C语言(第三十六天)

4. 位操作符&#xff1a;&、|、^ 位操作符有&#xff1a; & //按位与 | //按位或 ^ //按位异或 注&#xff1a;他们的操作数必须是整数。 直接上代码&#xff1a; #include <stdio.h> int main() { int num1 -3; int num2 5; num1 & num2; num1 | num2; nu…...

005_C++数学库常用函数

数学库常用函数 函数 我们其实已经掌握了一些函数,比如主函数main()。还有其他的函数比如一些库中的函数,例:<stdio.h>头文件对应标准输入输出库中的printf()和scanf()、<stdlib.h>标准库头文件对应的标准库中的srand()和rand(),除此之外在C++中常用的还有数…...

Briefings in Bioinformatics投稿经验分享

期刊名: BRIEFINGS IN BIOINFORMATICS期刊名缩写:BRIEF BIOINFORM期刊ISSN:1467-5463E-ISSN:1477-40542023年影响因子/JCR分区:9.5/Q1latex模板:http://static.primary.prod.gcms.the-infra.com/static/site/journals/document/oup-authoring-template.zip?node=7987de4…...

【原创】jmeter并发测试计划

bankQPS 创建线程组 设置并发参数 HTTP请求GET 添加HTTP请求 GET请求 查看结果树 HTTP请求 POST 添加HTTP请求 参数必须设置头信息格式&#xff1a; 添加HTTP头信息 查看结果树 可以选择&#xff0c;仅查看错误日志 汇总报告...

飞腾PSPA可信启动--1 非对称加密

最近计划在梳理下飞腾安全平台架构PSPA&#xff0c;就先从可信启动开始吧。有一些基础的密码学知识&#xff0c;各位在研究可信固件的时候可能会有一些不解&#xff0c;为了便于大家理解&#xff0c;编了几个小故事&#xff0c;希望能够帮助大家理清其中的各种关系。目前可信启…...

基于RabbitMQ的模拟消息队列需求文档

文章目录 一、项目背景二、需求分析1.核心概念2.BrokerServer核心组件3.核心API4.交换机类型5.持久化6.网络通信7.消息应答 三、消息队列模块划分 一、项目背景 什么是消息队列&#xff1f; 消息队列就是&#xff0c;基于阻塞队列&#xff0c;封装成一个独立的服务器程序&#…...

“北科Java面试宝典(211最详细讲解)“

Version : V1.0 北科Java面试宝典一、Java基础面试题【24道】二、JVM虚拟机面试题【14道】三、集合相关面试题【17道】四、多线程 【25道】五、IO【5道】六、网络编程 【9道】七、MySQL以及SQL面试题【20道】八、常用框架【19道】九、中间件和分布式 【54道】十、设计模式面试 …...

自动化测试工具Selenium的语法续.

OK&#xff0c;那么上篇博客我们介绍了如何搭建基于Javaselenium的环境&#xff0c;并且使用selenium的一些语法给大家演示了如何进行自动化测试的案例&#xff0c;那么本篇博客我们来继续学习selenium的一些其他的比较重要的语法&#xff0c;感谢关注&#xff0c;期待三连~ 目…...

稳恒电路直观理解

图v0 图v1 图v2 图v3 图v4 自由正电荷s&#xff0c;定向移动过程中&#xff0c;在任何一位置处受力都是平衡的&#xff0c;即s所受总合力为0&#xff0c; 即s处于匀速运动&#xff1a;直导体中匀速直线运动、拐弯处匀速圆周运动 起初t0时刻, s的势能是最高的E0&#xff0c;之…...

LeetCode面试经典150题(day 3)

169. 多数元素 难度&#xff1a;简单 给定一个大小为 n 的数组 nums &#xff0c;返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的&#xff0c;并且给定的数组总是存在多数元素。 示例 1&#xff1a; 输入&#xff1a;nums …...

掌握这个工具,轻松管理所有物流信息

在电子商务高度发达的今天&#xff0c;物流快递行业在全球范围内发挥着至关重要的作用。然而&#xff0c;在如此复杂的物流环境中&#xff0c;快递退回件的管理和查询成为了一个难题。为了解决这个问题&#xff0c;我们有一个神奇的工具——快递批量查询高手。 快递批量查询高…...

1.Python操作txt文本

文章目录 1.Python读取一个txt文件的内容并将其写入到另一个txt文件2.Python读取一个未知编码的文件并将其设置为指定编码格式3.Python实现txt文件中字符串的替换 1.Python读取一个txt文件的内容并将其写入到另一个txt文件 # -*- encoding:gb2312 -*- import chardetdef read_…...

Redis 主从复制和哨兵模式

一、概念 主从复制&#xff0c;是指将一台 Redis 服务器的数据&#xff0c;复制到其他的 Redis 服务器。前者称为主节点&#xff08;master/leader&#xff09;&#xff0c;后者称为从节点&#xff08;slave/follower&#xff09;。数据的复制是单向的&#xff0c;只能由主节点…...

【已解决】在 SpringBoot 中使用 CloseableHttpClient 调用接口时,接收参数中的中文变为“?“

问题描述 由于项目需要&#xff0c;需要在代码中使用POST请求去调用另一个服务的接口&#xff0c;即不通过前端&#xff0c;A 项目直接在方法中发起HTTP请求调用 B 项目的接口&#xff0c;当请求体中的参数有中文时&#xff0c;参数接收后中文会变为“?”。 具体原因是参数的…...

研磨设计模式day15策略模式

场景 问题描述 经常会有这样的需要&#xff0c;在不同的时候&#xff0c;要使用不同的计算方式。 解决方案 策略模式 定义&#xff1a; 解决思路&#xff1a;...

Densenet模型详解

模型介绍 DenseNet的主要思想是密集连接&#xff0c;它在卷积神经网络&#xff08;CNN&#xff09;中引入了密集块&#xff08;Dense Block&#xff09;&#xff0c;在这些块中&#xff0c;每个层都与前面所有层直接连接。这种设计可以让信息更快速地传播&#xff0c;有助于解…...

华为eNSP模拟器中,路由器如何添加serial接口

在ensp模拟器中新建拓扑后&#xff0c;添加2个路由器。 在路由器图标上单击鼠标右键&#xff0c;选择设置选项。 在【视图】选项卡的【eNSP支持的接口卡】窗口查找serial接口卡。 选择2SA接口卡&#xff0c;将其拖动到路由器空置的卡槽位。 如上图所示&#xff0c;已经完成路由…...

Linux脚本- 执行当前文件下前500个.c文件,并将每个文件对应的执行结果重定向到同名的.ok文件中

需求&#xff1a;执行当前文件下前500个.c文件&#xff0c;并将每个文件对应的执行结果重定向到同名的.ok文件中 以下是一个用于实现该功能的 Bash 脚本。 #!/bin/bash# 计数器&#xff0c;用于限制处理的文件数量 counter0# 遍历当前目录下的所有 .c 文件 for c_file in *.c…...