第9步---MySQL的索引和存储引擎
第9步---MySQL的索引和存储引擎
1.索引
1.1分类
索引可以快速的找出具有特定值的行。不用从头开始进行寻找了。
类别
-
hash和b+tree

hash
-
根据字段值生生成一个hash的值
-
快速的进行定位到对应的行的值
-
可能会出现相同的值,找到对应的空间会出现对应的值
b+tree树
-
基于树的结构
-
左边的数据都是比较大的
-
中间的是相似的大小的数据
-
最右边的是比较大的数据

类型
-
单列:普通 唯一和主键
-
组合
-
全文
-
空间
1.2索引操作
基本语法
index 索引名字(要添加索引名称的列) -- 给name列创建索引
创建的方法
三种方式
创建表的时候
直接创建
修改表的方式
创建表的时候进行指定
-- ========================索引相关操作=================
-- 方式1-创建表的时候直接指定
DROP TABLE IF EXISTS student;
create table student(sid int primary key,card_id varchar(20),name varchar(20),gender varchar(20),age int,birth date, phone_num varchar(20),score double,index index_name(name) -- 给name列创建索引
);
刚刚创建的是普通的normal的索引的类型,创建的数据结构是btree。
之后查询指定索引的时候才是会有效的。而且数据量需要达到一定的规模不然也是不行的,速度变化不是很大的。
-- 直接创建的方式
CREATE INDEX index_gender ON student (gender);-- 修改表结构的方式
ALTER TABLE student add index index_age(age);
1.3查看索引
-- 1、查看数据库所有索引
-- select * from mysql.`innodb_index_stats` a where a.`database_name` = '数据库名’;
select * from mysql.`innodb_index_stats` a where a.`database_name` = 'xx';-- 2、查看表中所有索引
-- select * from mysql.`innodb_index_stats` a where a.`database_name` = '数据库名' and a.table_name like '%表名%’;
select * from mysql.`innodb_index_stats` a where a.`database_name` = 'xx' and a.table_name like '%student%';-- 3、查看表中所有索引
-- show index from table_name;
show index from student;
最后一个就可以了。前两个是比较详细的数据的信息了。
1.4删除索引
-- 删除索引
drop INDEX 索引名字 ON 表名;
alter table student drop index index_age; drop INDEX index_gender ON student;
1.5唯一索引
创建表的时候创建唯一索引
直接创建唯一索引
修改表的时候创建唯一索引

-- 方式1-创建表的时候直接指定
create table student2(sid int primary key,card_id varchar(20),name varchar(20),gender varchar(20),age int,birth date, phone_num varchar(20),score double,unique index_card_id(card_id) -- 给card_id列创建索引
);

-- 方式2-直接创建
-- create unique index 索引名 on 表名(列名)
create table student3(sid int primary key,card_id varchar(20),name varchar(20),gender varchar(20),age int,birth date, phone_num varchar(20),score double
);
create unique index index_card_id on student3(card_id);
-- 方式3-修改表结构(添加索引)
-- alter table 表名 add unique [索引名] (列名)
create table student4(sid int primary key,card_id varchar(20),name varchar(20),gender varchar(20),age int,birth date, phone_num varchar(20),score double
);
alter table student4 add unique index_phone_num(phone_num);
删除索引
-- 操作-删除索引drop index 索引名 on 表名; alter table 表名 drop index 索引名;
1.6主键索引
在设置完主键进行创建表的时候会自动进行创建不需要单独进行指定索引。

1.7组合索引
针对的是对多个字段进行索引的设置的情况
-- 创建复合索引
-- 跟顺序是有关的
CREATE INDEX index_phone_number_name on (phone_num,name);

删除组合索引
drop index index_phone_number_name on student ;
创建一个组合唯一索引
-- 创建唯一索引两列的值不能相同
CREATE UNIQUE INDEX index_phone_number_name on student(phone_num,name);
当出现下面的第4种的情况的时候是不行的是会出现错误的。

什么时候可以用到索引呢?

组合索引是有原则的,最多优先的原则,尽量多的才能进行识别的。而且还遵循一个最左原则。
1.8全文索引
相似度的长度。数据量大的时候是比较好的。比全文检索的是快的。
不同的存储引擎对搜索引擎的支持是不同的。
最小搜索长度和最大搜索长度。
show variables like '%ft%';

可以在my.ini文件夹下进行设置。
1.9全文检索的操作
create table t_article (id int primary key auto_increment ,title varchar(255) ,content varchar(1000) ,writing_date date -- , -- fulltext (content) -- 创建全文检索
);insert into t_article values(null,"Yesterday Once More","When I was young I listen to the radio",'2021-10-01');
insert into t_article values(null,"Right Here Waiting","Oceans apart, day after day,and I slowly go insane",'2021-10-02');
insert into t_article values(null,"My Heart Will Go On","every night in my dreams,i see you, i feel you",'2021-10-03');
insert into t_article values(null,"Everything I Do","eLook into my eyes,You will see what you mean to me",'2021-10-04');
insert into t_article values(null,"Called To Say I Love You","say love you no new year's day, to celebrate",'2021-10-05');
insert into t_article values(null,"Nothing's Gonna Change My Love For You","if i had to live my life without you near me",'2021-10-06');
insert into t_article values(null,"Everybody","We're gonna bring the flavor show U how.",'2021-10-07');
创建表的时候时候创建全文索引,不推荐
-- fulltext (content) -- 创建全文检索-- 修改表结构添加全文索引
alter table t_article add fulltext index_content(content)-- 添加全文索引 推荐
create fulltext index index_content on t_article(content);

-- 使用全文索引
-- 跟最小的匹配的长度是相关的
SELECT * FROM t_article WHERE MATCH(content) against('you');
SELECT * FROM t_article WHERE content like '%you%';
1.10空间索引
不常用

create table shop_info (id int primary key auto_increment comment 'id',shop_name varchar(64) not null comment '门店名称',geom_point geometry not null comment '经纬度',spatial key geom_index(geom_point)
);

1.11hash算法

1.12二叉树

1.13B-Tree树和B+Tree树
MyISAM引擎采用的就是b+tree树作为索引结构的。

InnerDB和myisam是不一样的。

1.14索引的特点

1.15索引使用的原则
-
经常变动的不建议
-
数据量小的不建议
-
重复数据多的不建议
-
首先对where和order by的加上索引
2.存储引擎
2.1介绍
数据库底层的如那件组织。数据库管理系统使用数据引擎进行创建查询和更新以积极删除数据。
-- 查看引擎
SHOW ENGINES;

只有innnerdb是支持存储引擎的操作其他的是不支持引擎的操作的。
存储引擎的简单比较

2.2基本操作
-- 查看引擎
SHOW ENGINES;-- 查看当前默认的存储引擎
SHOW VARIABLES like '%storage_engine%';

-- 查看表的存储引擎
SHOW create TABLE student;
指定创建表时候的存储的引擎
CREATE TABLE `student7` (`sid` int(11) NOT NULL,`card_id` varchar(20) COLLATE utf8mb4_general_ci DEFAULT NULL,`name` varchar(20) COLLATE utf8mb4_general_ci DEFAULT NULL,`gender` varchar(20) COLLATE utf8mb4_general_ci DEFAULT NULL,`age` int(11) DEFAULT NULL,`birth` date DEFAULT NULL,`phone_num` varchar(20) COLLATE utf8mb4_general_ci DEFAULT NULL,`score` double DEFAULT NULL,PRIMARY KEY (`sid`)
) ENGINE=MyISAM -- 查看创建表时候的存储引擎
SHOW CREATE TABLE student7;
修改表的存储引擎
-- 修改表的存储引擎
ALTER TABLE student7 engine = InnoDB;
SHOW CREATE TABLE student7;
修改默认的数据库默认的存储引擎
-
关闭服务
-
修改myi.ini文件
-
找到Idefault-storage-engine=INNODB 修改成自己默认的引擎
-
重新启动服务
2.3事务操作
只有innoDB的存储引擎是支持事务的操作的。
转账的时候必须需要支持事务的操作的,需要保证转出的钱是正确的。
-- 创建账户表
create table account(id int primary key, -- 账户idname varchar(20), -- 账户名money double -- 金额
);-- 插入数据
insert into account values(1,'zhangsan',1000);
insert into account values(2,'lisi',1000);
事务操作就是把几条sql绑定在一起然后采用统一的操作,将失败的进行回滚。
-
开启事务:begin 或者是START TRANSACTION;
-
提交事务:commit
-
回滚事务:rollback
-- 设置的事务的时候需要先设置事务 不能自动提交
-- 需要为一个整体设置事务的操作不能单独的进行设置事务的操作
-- 设置事务操作-- 设置事务手动提交
SELECT @@autocommit;
-- 设置手动提交事务
set autocommit=0;
-- 设置事务自动提交
set autocommit=1;-- 转账的操作
BEGIN;
UPDATE account set money=money-200 WHERE name ='zhangsan';
UPDATE account set money=money+200 WHERE name ='lisi';
COMMIT;

-- 先执行下面的这几句sql
BEGIN;
UPDATE account set money=money-200 WHERE name ='zhangsan';
UPDATE account set money=money+200 WHERE name ='lisi';
此时进行下面的操作
-
此时查询的数据是内存中的数据是没有进行持久化的数据
-
但是navicat中得数据是持久化的数据
SELECT * FROM account;
此时内存中的数据是发生变化的。

此时数据没有从内存中持久化到数据库中的,此时进行提交的话操作才能进行生效。提交了之后就不能进行事务的回滚的操作了。需要在没有提交的时候进行回滚的操作。
rollback;
一般的事务的操作时通过异常才进行事务的回滚的操作。正常的时候是不需要进行事务的操作。
事务的特性
-
原子性:要么全做要么全不做
-
一致性:一个正确的状态转换成另外一个正确的状态
-
隔离性:事务之间是相互之间不能干扰的
-
持久性:事务提交之后。事务的操作时永久的不能进行更改的。
2.4隔离性
isolate:事务和事务之间要 隔离起来,比如多个事务操作同一个表。
-
读未提交:A事务会读取到B事务没有提交的数据
-
读提交:A事务不会读取B事务没有提交的数据,但是不能重复读
-
可重复读:有幻读
-
序列化:互斥的,效率低下,数据库表被锁定了


下面是隔离级别的演示

-- 查看隔离级别
show variables like '%isolation%';

此时对下面表中的数据进行相关的操作。

-- 执行下面的操作
set autocommit=0;-- 设置隔离级别
/*
set session transaction isolation level 级别字符串
级别字符串:read uncommitted、read committed、repeatable read、serializable
*/
-- 设置read uncommitted
set session transaction isolation level read uncommitted;
-- 这种隔离级别会引起脏读,A事务读取到B事务没有提交的数据-- 设置read committed
set session transaction isolation level read committed;
-- 这种隔离级别会引起不可重复读,A事务在没有提交事务之前,可看到数据不一致-- 设置repeatable read (MySQ默认的)
set session transaction isolation level repeatable read;
-- 这种隔离级别会引起幻读,A事务在提交之前和提交之后看到的数据不一致-- 设置serializable
set session transaction isolation level serializable;
-- 这种隔离级别比较安全,但是效率低,A事务操作表时,表会被锁起,B事务不能操作。
设置读未提交


上面两个数据目前是正常的
分别执行
-- 设置隔离级别
set session transaction isolation level read uncommitted;
第一个开启事务
begin;
第二个开始事务
-- 开启事务
begin;
第一个zhangsan转出去500
UPDATE account set money=money-500 WHERE name ='zhangsan';
第二个执行
SELECT * FROM account WHERE name ='zhangsan';

当第一个回滚了事务
rollback;
第二个再去执行
SELECT * FROM account WHERE name ='zhangsan';
此时查询到的数据就是1000

出现了脏读。
设置读已提交
两个都进行执行
-- 设置事务隔离级别
set session transaction isolation level read committed;set autocommit=0;
第一个和第二个执行
BEGIN;
第一个执行
UPDATE account set money=money-500 WHERE name ='zhangsan';
第二个执行
SELECT * FROM account WHERE name ='zhangsan';

第一个执行
COMMIT;
第二个执行
SELECT * FROM account WHERE name ='zhangsan';

可重复读
A和B都执行下面得操作
set session transaction isolation level repeatable read;
-- 设置事务手动提交
SELECT @@autocommit;
-- 设置手动提交事务
set autocommit=0;
begin;
B执行下面得操作
SELECT * FROM account WHERE name ='zhangsan';
A执行下面得操作
UPDATE account set money=money-500 WHERE name ='zhangsan';
B执行下面得操作
SELECT * FROM account WHERE name ='zhangsan';
此时查询得数据还是正常得。

A提交事务
COMMIT;
B执行下面得操作
SELECT * FROM account WHERE name ='zhangsan';
此时查询得数据还是正常的。

此时读取的数据还是原先的数据。
B执行下面的操作
COMMIT;
SELECT * FROM account WHERE name ='zhangsan';

B在事务提交前和提交后读取的数据是不同的。
序列化
B设置了事务执行了操作A被卡死了,只有B提交了事务A才能执行对应的操作

2.5锁机制
保障数据被并发进行访问的时候可以保证数据的正确性。
分类
-
表锁:操作时。会锁定整个表。
-
行锁:操作时,会锁定当前的行。
下面是存储引擎对锁的执行的类型

下面是对表级别锁的介绍

表锁是查询位置,行锁针对的是并发的操作。
2.6MyISAM
读锁 MyISAM在执行查询之前会加一个读锁。一般的情况下 不需要用户指定对应的锁。
lock table 表名 read;
select * from 表名;
-- 可以正确的进行读取。但是不能进行修改。
此时另外一个客户端
-
可以加读锁
-
但是不能加入写锁。
加了读锁的就不能读取别的表的数据了。和在银行中进行取钱是差不多的。
unlock tables;
此时就能操作别的操作了。
读锁是共享锁。都可以加,不能读取别的表中的数据,不能修改当前表中的数据。
写锁
A加了写锁,B不能读取也不能读取也不能加写锁的。
也就是A加了B不能读不能写的。
只能加一个写锁。
2.7InnoDB行锁
表级锁和MyISAM是相似的。
行锁。

行锁的模式

相关文章:
第9步---MySQL的索引和存储引擎
第9步---MySQL的索引和存储引擎 1.索引 1.1分类 索引可以快速的找出具有特定值的行。不用从头开始进行寻找了。 类别 hash和btree hash 根据字段值生生成一个hash的值 快速的进行定位到对应的行的值 可能会出现相同的值,找到对应的空间会出现对应的值 btree树…...
Numpy入门(3)—线性代数
线性代数 线性代数(如矩阵乘法、矩阵分解、行列式以及其他方阵数学等)是任何数组库的重要组成部分,NumPy中实现了线性代数中常用的各种操作,并形成了numpy.linalg线性代数相关的模块。本节主要介绍如下函数: diag&am…...
php的openssl_encrypt是不是自动做了PKCS5Padding?
在PHP中,openssl_encrypt函数默认使用的是PKCS7填充(不是PKCS5填充)。PKCS7填充实际上是PKCS5填充的扩展,用于对不同块大小的数据进行填充。 当你使用openssl_encrypt函数进行加密时,如果你没有显式指定填充模式和填充…...
在本地创建repository及上传至github
文章目录 本地管理设定git的用户名与邮箱初始化添加修改提交修改设定分支问题一:error: insufficient permission for adding an object... 数据同步创建SSH keys创建并关联远程仓库上传改动至github问题二:Failed to connect to github.com port 443: Connection timed out问题…...
情人节特别定制:多种语言编写动态爱心网页(附完整代码)
写在前面案例1:HTML Three.js库案例2:HTML CSS JavaScript案例3:Python环境 Flask框架结语 写在前面 随着七夕节的临近,许多人都在寻找独特而令人难忘的方式来表达爱意。在这个数字时代,结合创意和技术࿰…...
Docker mysql主从同步安装
1. 构建master实例 docker run -p 3307:3306 --name mysql-master \ -v /mydata/mysql-master/log:/var/log/mysql \ -v /mydata/mysql-master/data:/var/lib/mysql \ -v /mydata/mysql-master/conf:/etc/mysql \ -e MYSQL_ROOT_PASSWORDroot \ -d mysql:5.7 2. 构建master配置…...
docker update 命令
docker update 更新一个或多个容器的配置。官方文档 用法 $ docker update [OPTIONS] CONTAINER [CONTAINER...]请参阅选项部分OPTIONS,了解此命令可用的概述。 描述 该docker update命令动态更新容器配置。您可以使用此命令来防止容器消耗 Docker 主机的过多资…...
阻塞和挂起的区别和联系
阻塞和挂起是进程两种不同的状态,其描述如下: 阻塞:正在执行的进程由于发生某时间(如I/O请求、申请缓冲区失败等)暂时无法继续执行。此时引起进程调度,OS把处理机分配给另一个就绪进程,而让受阻…...
水力发电厂测量装置配置选型及厂用电管理系统
《水力发电厂测量装置配置设计规范》对水电厂的测量装置配置做了详细要求和指导。测量装置是水力发电厂运行监测的重要环节,水电厂的测量主要分为电气量测量和非电量测量。电气测量指使用电的方式对电气实时参数进行测量,包括电流、电压、频率、功率因数…...
【RabbitMQ】RabbitMQ整合SpringBoot案例
文章目录 1、前情提要【RabbitMQ】2、RabbitMQ-SpringBoot案例 -fanout模式2.1 实现架构总览2.2 具体实现2.2.1生产者2.2.1消费者 1、前情提要【RabbitMQ】 【RabbitMQ】消息队列-RabbitMQ篇章 RabbitMQ实现流程 2、RabbitMQ-SpringBoot案例 -fanout模式 2.1 实现架构总览…...
如何在window下cmd窗口执行linux指令?
1.Git:https://git-scm.com/downloads(官网地址) 2.根据自己的实际路径,添加两个环境变量 3.重启电脑...
c++基础系列:字符串、向量和数组
字符串、向量和数组 命名空间的using声明 目前用到的库函数基本上都属于命名空间std;通过using声明(using declaration)实现更简单的途径使用到命名空间中的成员。 标准库类型string string表示可变长的字符序列,必须先包含st…...
docker 05(dockerfile)
一、docker镜像原理 镜像可以复用 二、容器转镜像 将容器保存为镜像[参考] docker commit -a -m 现有容器ID 保存后的名称:版本号 -a :提交的镜像作者; -c :使用Dockerfile指令来创建镜像; -m :提交时的说明文字; -p :…...
PostMan 测试项目是否支持跨域
使用PostMan可以方便快速的进行跨域测试。 只需要在请求头中手动添加一个Origin的标头,声明需要跨域跨到的域(IP:端口)就行,其余参数PostMan会自动生成。添加此标头后,请求会被做为一条跨域的请求来进行处…...
jsp 协同过滤 图书管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目
一、源码特点 JSP 协同过滤 图书管理系统是一套完善的java web信息管理系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境 为TOMCAT7.0,Myeclipse8.5开发,数据库为My…...
商城-学习整理-高级-商城业务-商品上架es(十)
目录 一、商品上架1、sku在ES中存储模型分析2、nested数据类型场景3、构造基本数据(商品上架) 二、首页1、项目介绍2、整合thymeleaf(spring-boot下模板引擎)渲染页面3、页面修改不重启服务器实时更新4、渲染二级三级数据 三、搭建…...
【水文学法总结】河道内生态流量计算方法(含MATLAB实现代码)
生态流量(Ecological Flow, EF) 是指维持河道内生态环境所需要的水流流量。生态流量计算方法众多,主要分为水文学方法、栖息地模拟法、水力学方法、整体法等,各方法多用于计算维持河道生态平衡的最小生态流量(Minimum …...
特斯拉Model 3的七年狂飙
作者 | 张祥威 编辑 | 德新 发布一周拿下32万张订单,之后用时五年,交付量突破100万辆。粗略计算,自2016年发布至今,特斯拉Model 3已交付超150万辆。 放眼新能源赛道,如此战绩 别无二家。 Model 3踩中纯电动车的…...
物流签收异常,财务对账复杂,怎么解决?
电子商务行业的蓬勃发展为人们的购物体验带来了巨大的便利,然而,随之而来的物流签收异常和财务对账复杂问题却给电商企业的财务部门带来了一系列困扰。 每天大量的订单和货物流转,不可避免地导致了物流签收数据与财务记录之间的不一致和差异…...
docker之镜像与数据卷
镜像 简介 1.镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于环境开发的软件,他包含运行某个软件所需的所有内容,包括代码、运行时库、环境变量、配置文件 2.将所有的应用和环境11,直接打包成docker镜像&…...
STM32串口环形队列IAP固件更新方案
基于STM32串口环形队列的IAP实现方案1. 项目概述1.1 系统架构本方案实现了一种基于STM32F103C8T6微控制器的串口IAP(In-Application Programming)系统,采用环形队列缓冲机制解决有限SRAM空间下的固件更新问题。系统将64KB Flash空间划分为四个功能区域:B…...
单片机通用按键处理模块设计与实现
单片机通用按键处理模块设计与实现1. 项目概述1.1 模块功能特性本按键处理模块为单片机系统提供了一套完整的按键事件处理解决方案,具有以下核心功能:基础按键检测:支持按下(PRESS)和释放(RELEASE)事件检测高级触发模式:长按触发(…...
3分钟掌握Balena Etcher:安全可靠的跨平台镜像烧录工具
3分钟掌握Balena Etcher:安全可靠的跨平台镜像烧录工具 【免费下载链接】etcher Flash OS images to SD cards & USB drives, safely and easily. 项目地址: https://gitcode.com/GitHub_Trending/et/etcher Balena Etcher是一款专为简化操作系统镜像部署…...
Comsol流固耦合分析中的达西定律模块与固体力学模块的应用
Comsol流固耦合注浆及冒浆分析 采用其中达西定律模块及固体力学模块,通过建立质量源项、体荷载等实现上述考虑渗流场与结构场流固耦合理论方程的嵌入。在COMSOL里玩流固耦合就像给工程问题装了个动态CT扫描仪。最近在搞注浆冒浆模拟时发现,把达西渗流和固…...
RPA-Python与pytest-microsoftgraph-python-sdk集成:pytest-microsoftgraph-python-sdk测试自动化
RPA-Python与pytest-microsoftgraph-python-sdk集成:pytest-microsoftgraph-python-sdk测试自动化 【免费下载链接】RPA-Python Python package for doing RPA 项目地址: https://gitcode.com/gh_mirrors/rp/RPA-Python RPA-Python是一款强大的Python RPA工具…...
Fish-Speech-1.5开源模型的企业级部署架构设计
Fish-Speech-1.5开源模型的企业级部署架构设计 如果你正在考虑将Fish-Speech-1.5这个强大的语音合成模型引入到自己的业务中,比如做个智能客服、有声书平台,或者给产品加个语音播报功能,那你肯定不能只满足于在本地电脑上跑个Demo。一旦涉及…...
Phi-4-Reasoning-Vision惊艳案例:模糊图像增强后多步逻辑推理还原
Phi-4-Reasoning-Vision惊艳案例:模糊图像增强后多步逻辑推理还原 1. 项目概述 Phi-4-Reasoning-Vision是基于微软Phi-4-reasoning-vision-15B多模态大模型开发的高性能推理工具,专为双卡4090环境优化。这款工具能够处理复杂的图像推理任务,…...
Connect to Oracle Database with JDBC Driver
1. Overview The Oracle Database is one of the most popular relational databases. In this tutorial, we’ll learn how to connect to an Oracle Database using a JDBC Driver. 2. The Database To get us started, we need a database. If we don’t have access to …...
突破数据采集困境:Easy-Scraper 重构网页信息提取范式
突破数据采集困境:Easy-Scraper 重构网页信息提取范式 【免费下载链接】easy-scraper Easy scraping library 项目地址: https://gitcode.com/gh_mirrors/ea/easy-scraper 在数据驱动决策的时代,网页数据采集如同挖掘数字金矿。但传统工具往往陷入…...
Apollo LQR横向控制实战:从Simulink到C++的完整迁移指南(附ROS节点代码)
Apollo LQR横向控制工程化实战:从仿真验证到C落地的深度解析 在自动驾驶系统的开发流程中,控制算法的工程化落地往往是最具挑战性的环节之一。本文将聚焦LQR(线性二次调节器)算法在Apollo开源框架中的实际应用,通过完…...

