mysql索引、事务、存储引擎
一、索引
索引的概念:
- 索引是一个排序的列表,在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址(类似于C语言的链表通过指针指向数据记录的内存地址)。
- 使用索引后可以不用扫描全表来定位某行的数据,而是先通过索引表找到该行数据对应的物理地址然后访问相应的数据,因此能加快数据库的查询速度。
- 索引就好比是一本书的目录,可以根据目录中的页码快速找到所需的内容。
- 索引是表中一列或者若干列值排序的方法。
- 建立索引的目的是加快对表中记录的查找或排序
总结:索引就是能够使系统更快速查询信息的结构
索引的作用(副作用):
作用:
-
数据库利用各种快速定位技术,能够大大加快查询速率
-
当表很大或查询涉及到多个表时,可以成千上万倍地提高查询速度
-
可以降低数据库的IO成本,并且还可以降低数据库的排序成本
-
通过创建唯一性索引保证数据表数据的唯一性
-
可以加快表与表之间的连接
-
在使用分组和排序时,可大大减少分组和排序时间
副作用:
-
索引需要占用额外的磁盘空间
-
在插入和修改数据时要花费更多的时间,因为索引也要随之变
创建索引的原则依据:
- 索引虽可以提升数据库查询的速度,但并不是任何情况下都适合创建索引。因为索引本身会消耗系统资源,在有索引的情况下,数据库会先进行索引查询,然后定位到具体的数据行,如果索引使用不当,反而会增加数据库的负担
- 表的主键、外键必须有索引。因为主键具有唯一性,外键关联的是子表的主键,查询时可以快速定位
- 记录数超过300行的表应该有索引。如果没有索引,需要把表遍历一遍,会严重影响数据库的性能
- 经常与其他表进行连接的表,在连接字段上应该建立索引
- 唯一性太差的字段不适合建立索引
- 更新太频繁地字段不适合创建索引
- 经常出现在 where 子句中的字段,特别是大表的字段,应该建立索引
- 索引应该建在选择性高的字段上
- 索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引
索引的分类:
- 普通索引:针对所有字段,没有特殊的需求和规则
- 唯一性索引:针对唯一字段,仅允许出现一次空值
- 组合索引:多列/多字段组合的形式的索引,按照排序的顺序,否则无效
- 主键索引:针对唯一字段且不可为空,同时一张表只允许包含一个主键索引
- 全文索引:varchar、char、text、blob、clob 检索内部信息来做字段的索引
创建索引:
-
创建索引并且指向索引的字段 创建索引的时候直接致电给index
-
修改表的字段来添加索引 alter修改表结构的时候 添加add 添加index
-
创建表直接创建索引
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
事务隔离级别的作用范围分为两种:
-
全局级:对所有的会话有效
-
会话级:只对当前的会话有效
查询全局事务隔离级别:
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. 位操作符:&、|、^ 位操作符有: & //按位与 | //按位或 ^ //按位异或 注:他们的操作数必须是整数。 直接上代码: #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请求 参数必须设置头信息格式: 添加HTTP头信息 查看结果树 可以选择,仅查看错误日志 汇总报告...
飞腾PSPA可信启动--1 非对称加密
最近计划在梳理下飞腾安全平台架构PSPA,就先从可信启动开始吧。有一些基础的密码学知识,各位在研究可信固件的时候可能会有一些不解,为了便于大家理解,编了几个小故事,希望能够帮助大家理清其中的各种关系。目前可信启…...
基于RabbitMQ的模拟消息队列需求文档
文章目录 一、项目背景二、需求分析1.核心概念2.BrokerServer核心组件3.核心API4.交换机类型5.持久化6.网络通信7.消息应答 三、消息队列模块划分 一、项目背景 什么是消息队列? 消息队列就是,基于阻塞队列,封装成一个独立的服务器程序&#…...
“北科Java面试宝典(211最详细讲解)“
Version : V1.0 北科Java面试宝典一、Java基础面试题【24道】二、JVM虚拟机面试题【14道】三、集合相关面试题【17道】四、多线程 【25道】五、IO【5道】六、网络编程 【9道】七、MySQL以及SQL面试题【20道】八、常用框架【19道】九、中间件和分布式 【54道】十、设计模式面试 …...
自动化测试工具Selenium的语法续.
OK,那么上篇博客我们介绍了如何搭建基于Javaselenium的环境,并且使用selenium的一些语法给大家演示了如何进行自动化测试的案例,那么本篇博客我们来继续学习selenium的一些其他的比较重要的语法,感谢关注,期待三连~ 目…...
CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...
家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...
VTK如何让部分单位不可见
最近遇到一个需求,需要让一个vtkDataSet中的部分单元不可见,查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行,是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示,主要是最后一个参数,透明度…...
初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...
Linux离线(zip方式)安装docker
目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1:修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本:CentOS 7 64位 内核版本:3.10.0 相关命令: uname -rcat /etc/os-rele…...
基于PHP的连锁酒店管理系统
有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...
