MYSQL索引和事务

Mysql 索引 事务 存储引擎

索引:索引是一个排序的列表,列表当中存储的是索引的值和包含这个值的数据所在行的物理地址

索引的作用加快查询速度

索引的作用:

  1. 利用索引数据库可以快速定位,大大加快查询速度,主要作用
  2. 表的数据很多,查询需要关联多个表,这个时候索引也可以提高查询速度
  3. 加快表与表之间的连接速度
  4. 使用分组和排序时,可以大大减少时间
  5. 提高数据库恢复数据时的速度

索引创建的原则:

  1. 有索引,数据会先进行索引查询,然后定位数据,索引使用不当,反而会增加数据库的负担。主键,外键必须有索引(创建好了主键和外键自动就是索引,不需要额外声明)
  2. 一个表超过了300行记录,必须要有索引,否则数据库会遍历表的所有数据。
  3. 互相之间有关联的表,在这个关联字段应该设置索引
  4. 唯一性太差的字段,不适合创建索引
  5. 更新太频繁的字段,不适合做索引
  6. 经常被where条件匹配的字段,尤其是表数据比较多的,应该创建索引
  7. 在经常进行group by(分组语句) order by(排序语句)的字段上要建立索引
  8. 索引的列的字段越小越好,长文本的字段不适合建立索引

索引的类型:

查看表的索引:

show index from 表名

B-树索引 BTREE

树形结构的索引,也是大部分数据库的默认索引类型

根节点:树的最顶端的分支节点

分支节点:指向索引里其他的分支节点,也可以是叶子节点

叶子节点:直接指向表里的数据行

创建BTREE索引(前后要一致)

create index name_index on test (name);

查看表的索引号

show index from test;

哈希索引:散列索引 把任意长度的输入,通过散列算法变换成固定长度的输出。散列

值——分别对应数据里的列和行

Mysql的默认引擎:INNODB默认的索引类型就是Btree

MEMORY引擎可以支持HASH,也是他的默认索引。

先算散列值,然后在对应,速度比较慢,比btree慢

Hash的索引匹配:= in()<=>

更改索引类型

alter table test engine=memory;

创建HASH索引

create index idx_hash_column on test (sex) using hash;

创建表的时候需要考虑的因素:

1.关联程度 3张表,选好关联字段

  1. 每个字段的长度,也要考虑
  2. 设计合理的索引列
  3. 表数据,要控制在合理的范围之内。可以在牺牲一定性能的条件下,满足需求。5秒以上就要考虑优化了。10秒以上一般是出问题了。(缓存失效,缓存击穿,缓存雪崩)

普通索引:

建表时直接创建索引

create table member (

id int(4) PRIMARY KEY,

name varchar(10),

card_id int(18),

phone int(11),

index name_index (name)

);

show index from member;

修改表方式创建

alter TABLE member add index cardid_index (card_id);

唯一索引:unique

与普通索引类似,唯一索引的每个值都是唯一,唯一索引允许空值

添加唯一键才会创建唯一键。最好是不要为空。unique not null

创建唯一索引

create UNIQUE index phone_index on member (phone);

0表示唯一值,不能为空,不可以重复

create table test1 (

id int(4) PRIMARY key,

name varchar(10),

card_id int(18) not null,

phone int(11) not null,

UNIQUE cardid_index (card_id),

UNIQUE phone_index (phone)

);

show index from test1;

能在建表时创建好的条件,尽量在创建把条件约束好。不要创完之后再添加

主键索引:创建表的指定的主键就是索引。添加主键自动就是主键索引。

主键:值唯一 一个表只能有一个主键 不允许有空值 创建主键,自动主键索引

全文索引:

适合在进行模糊查询的时候使用,可以在一边文章中检索文本信息

建表时创建

create table test2 (

id int(4) PRIMARY key,

name varchar(10),

card_id int(18) not null,

phone int(11) not null,

notes text,

UNIQUE cardid_index (card_id),

UNIQUE phone_index (phone),

FULLTEXT notes_index (notes)

);

外部添加

create fulltext index notes_index on test2 (notes);

show index from test2;

使用全文索引查询

SELECT * FROM 表名 WHERE MATCH(列名) AGAINST('查询内容');

删除索引:

drop index notes_index on test2;

explain select * from test2 where notes like ‘京东%’;

这里的like是模糊查询的意思

前面添加explain,可以查看索引的使用情况

联合索引:指定一个索引名,一个索引名对应多个列名

create index index_union on test2(card_id,phone);

联合索引,查询时必须按照穿件时的顺序来进行查询

建表时创建

create table test3 (

id int(4) PRIMARY key,

name varchar(10),

card_id int(18) not null,

phone int(11) not null,

unique index name_cardid_phone (name,card_id,phone)

外部添加

create index index_union on test2(card_id,phone)

Mysql机制:默认会找最短的索引列。最优索引选择

联合索引,从左到右侧开始,不能跳过索引,否则索引会失效

范围查询,有可能右侧的索引会失效

如果索引是字符串,但是不加引号,索引也会失效

使用or语句索引一定失效,使用or作为条件,mysql无法同时使用多个索引

is null

is not null

有时候索引会失效 where is null 数据的绝大多数都是空值,索引失效

                 where is not null 数据多数为不null,索引失效

现在一张表的查询速度是7.62s,你该如何解决

首先查缓存,看是不是请求直接到了后端数据库。

再看索引,请求的列值不是默认的索引,添加一下即可,用explain

Mysql的事务:

事务是一种机制,一个操作序列,包含了一组数据库的操作命令,所有命令都是一个整体,向系统提交或者撤销的操作,要么都执行,要么都不执行。

不可分割的单位

事务的特点ACID:

A:原子性 最小单位,事务里的所有条件都是一个整体,不可分割。要么都成功,要么都失败。

C:一致性 事务开始之前和事务结束之后,数据库的完整性约束没有被破坏。

事务完成时,数据必须属于一致状态

事务开始前,数据库中的存储数据处于一致状态。

进行中的事务,数据可能处于不一致的状态

在事务最终完成时,必须再次回到已知的一致状态

I:隔离性 指在并发环境中,当不同事务同时操纵相同的数据时,每个事务都有各自的完整数据空间。

对数据进行修改的所有并发事务是彼此隔离的,表明事务必须是独立的

修改数据的事务可以另一个使用相同数据的事务开始之前访问这些数据。或者在另一个使用相同的事务结束之后访问这些数据。

D:持久性。数据提交,事务的效果将会被永久的保留在数据库中。而且不会被回滚

Mysql支持四种隔离级别:

  1. 未提交读(Read Uncommitted),允许脏读,允许一个事务可以看到其他事务未提交的修改
  2. 提交读(Read Committed ):事务只能查看已经提交的修改,未提交的修改是不可见的。防止脏读orcale sql server
  3. 可重复读(Repeatable Read),也是mysql的默认隔离级别。确保如果在一个事务中执行两次相同的select语句时,都能得到相同的结果不管其他事务是否提交修改。可以防止脏读以及不可重复读。
  4. 串行读(serializable),锁表,完全串行化,每一事务都隔离,读写都阻塞。

脏读:另外一个事务能够看到另一个事务未提交的修改结果

外部未提交,内部查看金额发生了变化,但是外部事务实际上没有提交这就是脏读

内部终端:

create table test (

id int(4) primary key,

money int(10)

);

insert into test values(1,1000);

insert into test values(2,500);

#插入数据

 begin

updata test set money=money-800 where id =1;

#修改金额

select * from test;

事务隔离级别的作用范围:

  1. 全局级,对所有的会话有效
  2. 会话级:只对当前的会话有效

查询全局事务的隔离级别(两种方式)

show global variables like '%isolation';

select @@global.tx_isolation;

查看会话级别(两种方式)

show session variables like '%isolation';

select @@session.tx_isolation;

set global transaction isolation level read uncommitted;

#设置全局事务的隔离级别。全局修改

set @@global.tx_isolation='read uncommitted';

#设置全局事务的隔离级别。临时修改。重启及失效

set session transaction isolation level read uncommitted;

#修改会话。全局修改。

set @@session.tx_isolation='read uncommitted';

#修改会话,临时修改。重启及失效

不可重复读:一个事务内,多次读同一个数据。前一个事务还没有结束,另一个事务也访问该数据。 在一个事务之内,两次查询结果不一致。读不到相同的数据内容。

内部外部终端都修改全局事务和会话

set session transaction isolation level read committed;

#修改会话。全局修改为提交读。

set global transaction isolation level read uncommitted;

#修改全局事务。全局修改为提交读。

show global variables like '%isolation';

#查询全局事务的隔离级别

flush privileges;

在内部终端里:

select * from test;

begin;

update test set money=money-200 where id =1;

回到外部终端:

select * from test;

commit;

幻读:一个事务对一个表中的数据进行了修改,可能会涉及到表中的全部数据。另一个事务也是修改了表中的数据,插入了一行新的数据。前一个事务会发现表中还有数据没有修改,类似于幻觉。

丢失更新:两个事务同时修改一条记录,A先修改记录,b也修改了记录,b一旦提交会覆盖A的结果

以上这些情况如何避免:

1.权限控制

2.根据情况来使用隔离级别

生产环境——最好是提交读和可重读

测试环境——无所谓

3.生产环境只能允许一个人对一个事务进行操作。其他人不允许操作

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

事务的控制语句:

BEGIN

显示的开启事务

START transaction

提交事务

commit

commit work

回滚,撤销正在进行的所有未提交的修改

rollback

rollback work

创建回滚点,一个事务可以有多个回滚点

savepoint s1;

回滚到还原点

rollback to s1;

多点还原,s1 s2

如果说还原到s1,s2将消失

如果

Mysql 提交事务默认是自动提交

可以用set来设备mysql提交方式:

show varchar like ‘autocommit’;

set autocommit=0;

show global variables like '%isolation';

#查询全局事务的隔离级别

select @@global.tx_isolation;

#也是查询全局事务的隔离级别

show session variables like '%isolation';

#查看会话级别

select @@session.tx_isolation;

#查看会话级别

 set AUTOCOMMIT=0;       

#关闭自动提交(仅针对当前会话),默认为1

 set global AUTOCOMMIT=0;   

 #关闭自动提交(针对全局事务),Mysql默认为1

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

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

相关文章

LINUX:如何以树形结构显示文件目录结构

tree tree命令用于以树状图列出目录的内容。 第一步&#xff0c;先安装tree这个包 sudo apt-get install tree 第二步&#xff0c;在指定文件目录输入下面命令&#xff0c;7代表7级子目录 tree -L 7 第三步&#xff0c;效果图 第四步&#xff0c;拓展学习 颜色显示 tree -C显…

Go json 差异比较 json-diff(RFC6902)

Go json 差异比较 json-diff(RFC 6902) 毕业设计中过程中为了比较矢量图的差异而依据 RFC 6902 编写的一个包&#xff0c;现已开源&#xff1a; Json-diff 使用 go get -u github.com/520MianXiangDuiXiang520/json-diff序列化与反序列化 与官方 json 包的序列化和反序列化不…

川崎ZX-6R确定引进,636它真的来了,3C认证已过。

最新消息&#xff0c;兄弟们&#xff0c;你们期待已久的川崎ZX6R&#xff08;636&#xff09;基本已经确定引进了&#xff0c;官方的3C认证已经通过&#xff0c;那么从3C里面我们可以看到哪几个信息&#xff1f;产品代号ZX636J就是心心念念的ZX-6R了。 有些小伙伴不太清楚3C认…

数据结构:第13关:查找两个单词链表共同后缀的起始结点

任务描述编程要求 输入输出测试说明来源 任务描述 本关任务&#xff1a;假定采用带头结点的单链表保存单词&#xff0c;当两个单词有相同的后缀时&#xff0c;则可共享相同的后缀空间。 例如&#xff0c;“loading”和“being”的存储映像如下图所示&#xff1a; 设str1和str2…

detectron2中save_text_instance_predictions⭐

save_text_instance_predictions demo.py中修改关于路径os.path.join()函数用于路径拼接文件路径&#xff0c;可以传入多个路径os.path.basename(path)就是给定一串路径的最终找到的那个文件python官方文档链接 将 Python 对象序列化为 JSON 字符串with open 打开文件&#xff…

PostGIS学习教程十三:几何图形创建函数

PostGIS学习教程十三&#xff1a;几何图形创建函数 目前我们看到的所有函数都可以处理已有的几何图形并返回结果&#xff1a; 分析几何图形&#xff08;ST_Length(geometry), ST_Area(geometry)) 几何图形的序列化&#xff08;ST_AsText(geometry), ST_AsGML(geometry)) 选取…

动态规划_不同路径||

//一个机器人位于一个 // m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 // // 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish”&#xff09;。 // // 现在考虑网格中有障碍物。那么…

坚守数字化创新烽火之地 百望云入选新华社“品牌信用建设典型案例”

潮起海之南&#xff0c;风好正扬帆。2023年12月2日-5日&#xff0c;南海之滨&#xff0c;由新华通讯社、海南省人民政府、中国品牌建设促进会主办的主题为“聚焦新质生产力&#xff0c;增强发展新动能”的2023中国企业家博鳌论坛在海南博鳌隆重举行。 群贤毕至&#xff0c;高朋…

vue零基础

vue 与其他框架的对比 框架设计模式数据绑定灵活度文件模式复杂性学习曲线生态VueMVVM双向灵活单文件小缓完善ReactMVC单向较灵活all in js大陡丰富AngularMVC双向固定多文件较大较陡&#xff08;Typescript&#xff09;独立 更多对比细节&#xff1a;vue 官网&#xff1a;ht…

银河麒麟v10系统SSH远程管理及切换root用户的操作方法

&#x1f4da;&#x1f4da; &#x1f3c5;我是默&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; ​​ &#x1f31f;在这里&#xff0c;我要推荐给大家我的专栏《Linux》。&#x1f3af;&#x1f3af; &#x1f680;无论你是编程小白&#xff0c;还是有一…

深入解析C++中的虚函数和虚继承:实现多态性与继承关系的高级特性

这里写目录标题 虚函数虚函数实现动态绑定虚继承抽象类 虚函数 虚函数是在C中用于实现多态性的一种特殊函数。它通过使用关键字"virtual"进行声明&#xff0c;在基类中定义&#xff0c;可在派生类中进行重写。虚函数允许在运行时根据对象的实际类型来调用相应的函数…

在HarmonyOS上使用ArkUI实现计步器应用

介绍 本篇Codelab使用ArkTS语言实现计步器应用&#xff0c;应用主要包括计步传感器、定位服务和后台任务功能&#xff1a; 通过订阅计步器传感器获取计步器数据&#xff0c;处理后显示。通过订阅位置服务获取位置数据&#xff0c;处理后显示。通过服务开发实现后台任务功能。…

MySQL使用教程

数据构成了我们日益数字化的社会基础。想象一下&#xff0c;从移动应用和银行系统到搜索引擎&#xff0c;再到如 ChatGPT 这样的先进人工智能聊天机器人&#xff0c;这些工具若没有数据支撑&#xff0c;将寸步难行。你有没有好奇过这些海量数据都存放在哪里呢&#xff1f;答案正…

基于JavaWeb+SpringBoot+Vue在线拍卖系统的设计和实现

基于JavaWebSpringBootVue在线拍卖系统系统的设计和实现 源码获取入口Lun文目录前言主要技术系统设计功能截图订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 源码获取入口 Lun文目录 摘 要 1 Abstract 1 1 系统概述 4 1.1 概述 4 1.2课题意义 4 1.3 主要内容 4 2 …

Android--Jetpack--Databinding源码解析

慢品人间烟火色&#xff0c;闲观万事岁月长 一&#xff0c;基本使用 关于databinding的基本使用请看之前的文章 Android--Jetpack--Databinding详解-CSDN博客 二&#xff0c;xml布局解析 分析源码呢&#xff0c;主要就是从两方面入手&#xff0c;一个是使用&#xff0c;一个…

C语言-枚举

常量符号化 用符号而不是具体的数字来表示程序中的数字 枚举 用枚举而不是定义独立的const int变量 枚举是一种用户定义的数据类型&#xff0c;他用关键词enum以如下语法来声明&#xff1a; enum枚举类型名字{名字0&#xff0c;…&#xff0c;名字n}&#xff1b; 枚举类型名…

HubSpot细分目标市场:拓展业务边界,突破增长瓶颈

在数字化时代&#xff0c;企业面临前所未有的市场挑战。随着科技的飞速发展&#xff0c;消费者期望个性化的体验&#xff0c;即时的互动&#xff0c;以及高质量、有价值的信息。这些变化使得企业不仅需要适应新的技术和趋势&#xff0c;还需要更加精细化地理解和满足不同细分市…

【广州华锐互动】AR昆虫在线教学软件:增强现实技术带你近距离探索微观世界

随着科技的不断发展&#xff0c;教育方式也在不断创新。在这个信息爆炸的时代&#xff0c;传统的教育方式已经无法满足人们对知识的渴望。为了让孩子们更好地了解自然界的奥秘&#xff0c;一款名为“AR昆虫在线教学软件”的应用程序应运而生&#xff0c;它将带领孩子们踏上一段…

HarmonyOS应用开发-手写板

这是一个基于HarmonyOS做的一个手写板应用&#xff0c;只需要简单的几十行代码&#xff0c;就可以实现如下手写功能以及清空画布功能。 一、先上效果图&#xff1a; 二、上代码 Entry Component struct Index {//手写路径State pathCommands: string ;build() {Column() {//…

kubeadm搭建单master多node的k8s集群--小白文,图文教程

参考文献 K8S基础知识与集群搭建 kubeadm搭建单master多node的k8s集群—主要参考这个博客&#xff0c;但是有坑&#xff0c;故贴出我自己的过程&#xff0c;坑会少很多 注意&#xff1a; 集群配置是&#xff1a;一台master&#xff1a;zabbixagent-k8smaster&#xff0c;两台…