焦作做网站/百度信息流广告怎么收费
索引
索引是一个列表 —— 若干列集合和这些值的记录在数据表存储位置的物理地址
作用
- 加快检索速度
- 唯一性索引 —— 保障数据唯一性
- 加速表的连接
- 分组和排序进行检索的时候 —— 减少时间消耗
一般建立原则
- 经常查询的数据
- 主键
- 外键
- 连接字段
- 排序字段
- 少涉及、重复值多的字段不建立索引
MySQL中 InnoDB存储引擎支持索引
name | use |
---|---|
普通索引 INDEX | 值可空,没有唯一性限制 |
唯一值索引 UNIQUE | 值可空,但唯一 |
主键索引 PRIMARY KEY | 一个表只能由一个PK, 系统自动创建 |
全文索引 FULLTEXT | 在 varchar、char、text 类型的列上创建,便于查询字符串类型 |
物理存储区分:
- 聚集索引
- 非聚集索引
创建 修改 删除 显示
CREATE INDEX
CREATE [UNIQUE | FULLTEXT | SPATIAL] INDEX 索引名[索引类型]
on 表名(索引列名)
[索引选项]
索引列名 =:
列名[(长度)][ASC|DESC]
- SPATIAL表示为空间索引
- 索引类型:BTREE或HASH
- 列名
- CHAR,VARCHAR, length可以小于字段实际长度 —— 减少索引文件
- BLOB和TEXT类型,必须指定 length
- 可包含属于同一个表的多个列,用逗号分开 —— 复合索引
- 没有PK索引
ALTER TABLE语句可以修改表定义,包括向表中添加索引
ALTER TABLE tbl_name ADD PRIMARY KEY | UNIQUE | INDEX | FULLTEXT (column_list)
删除
DROP INDEX 索引名 ON 表名
Alter TABLE 表名 ...
DROP PRIMARYKEY
| DROP {INDEX | KEY} 索引名
| DROP FOREIGN KEY 外键名
显示
SHOW INDEXES FROM tbl_name;
SHOW INDEXES FROM tbl_name IN db_name;
# *INDEX和KEY是INDEXES同义词
返回
name | use |
---|---|
table | 表的名称 |
NON_UNIQUE | 如果索引可以包含重复项,则为1;如果可以,则为0。 |
KEY_NAME | 索引的名称。主键索引始终具有PRIMARY名称。 |
seq_in_index | 索引中的列序列号。第一列序列号从1开始。 |
column_name | 列名称。 |
collation | 排序规则表示列在索引中的排序方式。A表示升序;B表示降序;NULL表示未分类。 |
cardinality | 基数返回索引中估计的唯一值数。请注意,基数越高 —— 查询优化器使用索引进行查找的可能性就越大。 |
sub_part | 索引前缀。如果对整个列编制索引,则为null。否则,它会显示部分索引列的索引字符数。 |
packed | 表示密钥是如何打包的。 |
null | YES——如果列可能包含NULL值,如果不包含空值则为空。 |
INDEX_TYPE | 表示使用诸如索引方法BTREE,HASH,RTREE,或FULLTEXT。 |
comment | 有关索引的信息未在其自己的列中描述 |
index_comment | 显示使用COMMENT属性创建索引时指定的索引的注释。 |
¤visible | 索引是否对查询优化器可见或不可见; YES 是,NO 不是。 |
expression | 如果索引使用表达式而不是列或列前缀值,则表达式指示键部分的表达式,并且column_name列也为NULL。 |
索引的使用情况
建议使用
- 唯一性的限制,比如用户名
- 频繁用WHERE查询字段
- GROUP BY和ORDER BY的列
- UPDATE、DELETE的WHERE条件列(类似2)
- DISTINCT字段需要创建索引
不建议使用
- WHERE GROUPBY ORDERBY 未出现的字段
- 记录较少的表 < 1000个
- 大量重复数据(比重偏差小
- 频繁更新的字段 (字段频繁更新导致索引更新效率慢)
失效
- 对索引进行 表达式计算
- 使用函数
- 使用LIKE且前缀为%
注意
- 多表JOIN连接操作时
- 连接表尽量不超3张
- 对WHERE条件创造index
- 于连接的字段创建索引,并且该字段在多张表中的类型必须一致
- 索引列尽量设置为 NOT NULL 约束
- 使用联合索引的时候要注意最左原则
- 从左到右的使用索引中的字段
- 一条 SQL 语句可以只使用联合索引的一部分,但要从最左侧开始,否则失效
- 当遇到范围查询(>、<、between、like)就会停止匹配
最左匹配原则
EXPAIN
name | use |
---|---|
¤ id | 选择标识符 |
¤ select_type | 表示查询的类型 |
¤ table | 输出结果集的表 |
¤ partitions | 匹配的分区 |
¤ type | 访问类型,常用的有: ALL、index、range、 ref、eq_ref、const、system、NULL(从左到右,性能从差到好) |
¤ possible_keys | 表示查询时,可能使用的索引,为NULL表示没有相关索引 |
¤ key | 表示实际使用的索引,如果为NULL表示没有选择索引 |
¤ key_len | 索引字段的长度,不损失精确性的情况下,长度越短越好 |
¤ ref | 列与索引的比较 |
¤ rows | 扫描出的行数(估算的行数) |
¤ filtered | 按表条件过滤的行百分比 |
¤ Extra | 执行情况的描述和说明 |
事务管理
MySQL 4.1开始支持事务,事务由作为一个单独单元的一个或多个SQL语句组成。
- 这个单元中的每个SQL语句是互相依赖的,而且单元作为一个整体是不可分割的
- 不能完成,整个单元就会回滚
- 事务中的所有语句都成功的执行这个事务才被成功地执行
提交
当一个会话开始时,系统变量AUTOCOMMIT值为1,即自动提交功能是打开的
任意一条SQL语句发送到服务器时,MySQL服务器会立即解析、执行并将更新结果提交到数据库文件中
在执行事务时要首先关闭MySQL的自动提交,使用命令“set autocommit=0;”可以关闭MySQL的自动提交
- 当MySQL关闭自动提交后,可以使用COMMIT命令来完成事务的提交,也标志transaction的结束
- 使用命令“start transaction;”可以开启一个事务 —— 隐式关闭MySQL的提交
注意
- transaction不能嵌套 —— 开始第二个事务会自动提交第一个事务
- 下面语句会隐式执行commit
- set autocommit=1、rename table、truncate table;
- create、alter、drop;
- grant、revoke、set password、create user、drop user、rename user
- lock tables、unlock tables
example
set autocommit=0;
insert into account values(111,500);
commit;
insert into account values(222,500);
create table student(
studentid char(6) primary key,
name varchar(10),
sex char(2)
)engine=innodb;
insert into account values(333,500);
select * from account;
在上面SQL语句执行过程中
- 首先使用命令“set autocommit=0;”关闭
MySQL的自动提交。 - 插入第一条记录后,使用commit命令完成事务的提交。
- 当插入第二条记录后,使用create命令创建数据表,由于create命令在执行时会隐式地执行commit命令,所以插入的第二条记录也会被提交。
- 当插入完第三条记录时,使用select语句查询到的是内存中的记录,所以查询结果可以看到新添加的三条记录。
- 由于最后一条语句并没有提交,所以该值并没有写到数据库文件中。另一客户机执行查询时,看到的是外存数据库文件在服务器内存中的一个副本,所以只查询到两条添加记录
- 当前客户机使用commit命令提交事务后,两个客户机看到的查询结果是相同的
回滚
销未提交的事务所做的各种修改操作,并结束当前这个事务
若只撤销一部分,可以用“部分回滚”
savepoint
保存点名;”可以在事务中设置一个保存点,使用“rollback to savepoint 保存点名;”可以将事务回滚到保存点状态
四大特性和隔离级别
四大特性
- 事务是一个单独的逻辑工作单元,事务中的所有更新操作要么都执行,要么都不执行。
- 事务保证了一系列更新操作的原子性。如果事务与事务之间存在并发操作,则可以通过事务之间的隔离级别来实现事务的隔离,从而保证事务间数据的并发访问。
ACID
ATOMICITY CONSISTENCY ISOLATION DURABILITY
- 原子性意味着每个事务都必须被认为是一个不可分割的单元,事务中的操作必须同时成功事务才是成功的。如果事务中的任何一个操作失败,则前面执行的操作都将回滚,以保证数据的整体性没有受到影响
- 事务的一致性保证了事务完成后,数据库能够处于一致性状态。如果事务执行过程中出现错误,那么数据库中的所有变化将自动地回滚,回滚到另一种一致性状态
- 由MySQL的日志机制处理,它记录了数据库的所有变化,为事务恢复提供了跟踪记录
- 如果系统在事务处理中发生错误,MySQL恢复过程将使用这些日志来发现事务是否已经完全成功地执行,是否需要返回
- 事务的隔离性确保多个事务并发访问数据时,各个事务不能相互干扰; 的每个事务在自己的空间执行,并且事务的执行结果只有在事务执行完才能看到 —— 其他事务暂时看不到结果 (可以使用页级锁定或行级锁定来隔离)
- 事务的持久性意味着事务一旦提交,其改变会永久生效,不能再被撤销。 —— 即使系统崩溃,一个提交的事务仍然存在
隔离级别
从低到高分别是
read uncommitted(读取未提交的数据)
read committed(读取提交的数据)
repeatable read(可重复读)
serializable(串行化)。
- read uncommitted(读取未提交的数据)提供了事务之间的最小隔离程度,处于这个隔离级别的事务可以读到其他事务还没有提交的数据
- read committed(读取提交的数据)处于这一级别的事务可以看见已经提交事务所做的改变
- repeatable read(可重复读)这是MySQL默认的事务隔离级别,它确保在同一事务内相同的查询语句其执行结果总是相同的(即使某个事务突然改了某个数据而且事务还没结束,前后查询的内容还是一样的)
- serializable(串行化) 最高级别的隔离,它强制事务排序,使事务一个接一个地顺序执行
解决多用户问题
用户对数据库并发访问时,为了确保事务完整性和数据库一致性,需要使用锁定 —— 防止用户读取正在由其他用户更改的数据,并可以防止多个用户同时更改相同数据
-
高级别的事务隔离 —— 有效地实现并发,但会降低事务并发访问的性能
-
低级别的事务隔离可以提高事务的并发访问性能,但可能导致并发事务中的脏读、不可重复读和幻读等问题
三个问题:
脏读 | 不可重复读 | 幻读 | |
---|---|---|---|
read uncommitted | ✔ | ✔ | ✔ |
read committed | × | ✔ | ✔ |
repeatable read | × | × | ✔ |
serializable | × | × | × |
脏读
一个事务可以读到另一个事务未提交的数据
- 打开MySQL客户机A,将当前MySQL会话的事务隔离级别设置为read uncommitted。
set session transaction isolation level read uncommitted
- 开启事务,查询账号为“111”账户的余额。
- 打开MySQL客户机B,将当前MySQL会话的事务隔离级别设置为read uncommitted。
- 开启事务,将账号为“111”账户余额增加800。
- 在MySQL客户机A中查看账号为“111”账户的余额。
- 关闭MySQL客户机A和客户机B后,再查看账号为“111”账户的余额。
这个时候 A 读到了B未结束事务但已更新的结果(也就是加了 800)
不可重复读
同一个事务中,两条相同的查询语句其查询结果不一致
- 一个事务访问数据时,另一个事务对该数据进行修改并提交,导致第一个事务两次读到的数据不一样
- 将MySQL客户机A与客户机B使用语句“set session transaction isolation level read committed;”,将他们的隔离级别都设置为read committed。
- 与例6-5相同,首先在MySQL客户机A中查询账号为“111”账户的余额。
- 在MySQL客户机B中将账号为“111”账户余额增加800,未提交事务时在MySQL客户机A中查询账号为“111”账户的余额,对比是否出现脏读。
- MySQL客户机B中提交事务后,在MySQL客户机A中查询账号为“111”账户的余额,对比是否出现不可重复读。
A读到的数据是B事务提交后的数据
幻读
当前事务读不到其他事务已经提交的修改(别人已经改了而且提交事务了,而你的读的内容还是修改之前的)
- 将MySQL客户机A与客户机B使用语句“set session transaction isolation level repeatable read;”,将他们的隔离级别都设置为repeatable read。
- 在MySQL客户机A中开启事务并查询账号为“999”的账户信息。
- 在MySQL客户机B中开启事务,插入一条账户信息(999,700),然后提交事务。
- 在MySQL客户机A中再次查账号为“999”的账户信息,判断是否可以避免不可重复读。
- 在MySQL客户机A中插入账户信息(999,700),并判断是否可以插入
相关文章:

数据库实践LAB大纲 06 INDEX
索引 索引是一个列表 —— 若干列集合和这些值的记录在数据表存储位置的物理地址 作用 加快检索速度唯一性索引 —— 保障数据唯一性加速表的连接分组和排序进行检索的时候 —— 减少时间消耗 一般建立原则 经常查询的数据主键外键连接字段排序字段少涉及、重复值多的字段…...

网络安全实验室6.解密关
6.解密关 1.以管理员身份登录系统 url:http://lab1.xseclab.com/password1_dc178aa12e73cfc184676a4100e07dac/index.php 进入网站点击忘记密码的链接,进入到重置密码的模块 输入aaa,点击抓包,发送到重放模块go 查看返回的链接…...

了解并发编程
并发与并行的概念: 并发:一段时间内(假设只有一个CPU)执行多个线程,多个线程时按顺序执行 并行:同个时间点上,多个线程同时执行(多个CPU) 什么是并发编程? 在现代互联网的应用中,会出现多个请求同时对共享资源的访问情况,例如在买票,秒杀与抢购的场景中 此时就会出现线程安…...

(C语言)程序环境和预处理
问:1. 什么是C语言的源代码?2. 由于计算机只认识什么?因此它只能接收与执行什么?也就是什么?3. 在ANSI C的任何一种实现中,存在哪两个不同的环境?在这两种环境里面分别干什么事情?4.…...

RiProV2主题美化增加支付页底部提示语ritheme主题美化
美化背景 默认的RiProV2主题在支付提示页,是没有这一行提示的 希望增加根据用户类别,未登录用户购买时提示:当前为游客模式购买。或者其他提示,提示用户未登录购买不保存购买记录等。 索引关键字:ritheme主题美化之增加支付页底部提示语,RiProV2主题美化增加支付页底部提…...

2022年文章分类整理
文章目录JetPack系列Kotlin相关View相关多线程相关存储相关Gradle相关动画相关其他2022年公众号(名字:代码说)发表的文章,分类整理一下,方便阅读!2023,继续加油,共勉!JetPack系列 Android Jetp…...

蓝牙设备中的Device UUID 与 Service UUID
Device UUID也可以被称作为DeviceID。 Android 设备上扫描获取到的 deviceId 为外围设备的 MAC 地址,相对固定。 iOS 设备上扫描获取到的 deviceId 是系统根据外围设备 MAC 地址及发现设备的时间生成的 UUID,是设备上的Core Bluetooth为该设备分配的标识…...

【学习记录】PCA主成分分析 SVD奇异值分解
在看MSC-VO代码的过程中,大量出现了奇异值分解的内容,本身对这部分了解不多,这里补一下课,参考b站up主小旭学长的视频,链接为:PCA主成分分析和SVD主成分分析 PCA主成分分析 PCA根本目的在于让数据在损失尽…...

用 Python 调用 GPT-3 API
用 Python 调用 GPT-3 API GPT-3 是去年由 Open AI 推出的语言机器学习模型。它因其能够写作、写歌、写诗,甚至写代码而获得了广泛的媒体关注!该工具免费使用,只需要注册一个电子邮件即可。 GPT-3 是一种叫 transformer 的机器学习模型。具体…...

类和对象实操之【日期类】
✨个人主页: Yohifo 🎉所属专栏: C修行之路 🎊每篇一句: 图片来源 The pessimist complains about the wind; the optimist expects it to change; the realist adjusts the sails. 悲观主义者抱怨风;乐观主义者期望它…...

微搭中如何实现弹性布局
我们在实际开发中经常可能会有一些社交的场景,比如开发一个类似朋友圈九宫格图片展示的功能。因为图片的数量不确定,所以需要实现图片的从左到右顺序排列。 在微搭中可以以可视化的方式设置样式。但是对于我们这类特殊需求,只用可视化设置显…...

九龙证券|外资强势出手!这只科创板百元股,被疯狂加仓
本周,北上资金净买入29.32亿元,连续第13周加仓A股。分商场看,北上资金加仓重点倾向于沪市的白马蓝筹股,沪股通取得50.34亿元,深股通则被净卖出21.02亿元。 食品饮料本周取得逾23亿元的增持,居职业首位&…...

51单片机最强模块化封装(4)
文章目录 前言一、创建key文件,添加key文件路径二、key文件编写三、模块化测试总结前言 本篇文章将为大家带来按键的模块化封装,这里使用到了三行按键使得我们的代码更加简便。 按键原理:独立按键 一、创建key文件,添加key文件路径 这里的操作就不过多解释了,大家自行看…...

五、Git本地仓库基本操作——分支管理
1. 什么是分支? master分支 我们在初始化git仓库的时候,会默认创建一个master分支,HEAD指针这时就会默认执行master分支。当我们在master分支提交(commit)了更新之后,master分支就会指向当前当前最新的co…...

vscode搭建python Django网站开发环境
这里使用pip安装的方式,打开命令行,输入执行: pip install django2.2这里选择安装2.2版本是因为是新的lts版本,长期支持稳定版。 接下来再安装pillow,Django底层一部分是基于pillow进行的。 pip install pillowpylint…...

【mybatis】实现分页查询
一 .使用原生分页器的实体类 1.1 java代码部分 方法多 不易书写 package cn.bdqn.entity;public class Page {private Integer pageIndex;//页码private Integer pageSize;//页大小 显示多少行数据private Integer totalCounts;//数据的总行数private Integer totalPages;//…...

CF1560D Make a Power of Two 题解
CF1560D Make a Power of Two 题解题目链接字面描述题面翻译题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1提示思路代码实现备注题目 链接 https://www.luogu.com.cn/problem/CF1560D 字面描述 题面翻译 给定一个整数 nnn。每次操作你可以做两件事情中的一件&am…...

C#开发的OpenRA的读取文件的函数
C#开发的OpenRA的读取文件的函数 在OpenRA游戏里,读取文件是必备的功能。 因为游戏大部分文件都是图片、动画、语音。 很久以前,我以为开发游戏的主要功能是在程序开发上, 其实游戏的大部分工作都不是在开发上,而是在美工方面。 因为游戏跟电影是一样,就是不断地展示场景,…...

SpringBoot结合XXL-JOB实现定时任务
Quartz的不足 Quartz 的不足:Quartz 作为开源任务调度中的佼佼者,是任务调度的首选。但是在集群环境中,Quartz采用API的方式对任务进行管理,这样存在以下问题: 通过调用API的方式操作任务,不人性化。需要…...

【Node.js】 创建web服务器
Node.js什么是客户端,什么是服务器服务器和普通电脑的区别什么是http模块导入http模块服务器相关概念创建web服务器的基本步骤req请求对象req响应对象解决中文乱码根据不同的url响应不同的html内容什么是客户端,什么是服务器 客户端在网络节点中&#x…...

基于go语言实现RestFul交互
一、RestFul 1.1 RestFul的介绍 RESTFUL(Representational State Transfer)是一种网络应用程序的设计风格和开发方式,基于HTTP或HTTPS,可以使用XML格式定义或JSON格式定义。RESTFUL适用于移动互联网厂商作为业务接口的场景&…...

情感溢出:读《浣溪沙》
浣溪沙 谁念西风独自凉 作者 纳兰性德 谁念西风独自凉,萧萧黄叶闭疏窗,沉思往事立残阳。 被酒莫惊春睡重,赌书消得泼茶香,当时只道是寻常。 记得年轻时学这篇词,就是愣背,现在也就记得这句当时只道是寻常…...

深入解读.NET MAUI音乐播放器项目(一):概述与架构
系列文章将分步解读音乐播放器核心业务及代码: 深入解读.NET MAUI音乐播放器项目(一):概述与架构深入解读.NET MAUI音乐播放器项目(二):播放内核深入解读.NET MAUI音乐播放器项目(三…...

【Python小游戏】某程序员将套圈游戏玩儿到了巅峰,好嗨哟~Pygame代码版《牛牛套圈》已上线,大人的套圈游戏太嗨了,小孩勿进。
前言 世上选择那么多。 关注栗子同学会是您最明智的选择哦。 所有文章完整的素材源码都在👇👇 粉丝白嫖源码福利,请移步至CSDN社区或文末公众hao即可免费。 “幸运牛牛套圈圈”套住欢乐,圈住幸福,等你来挑战…...

php的declare命令如何使用?
php中的declare结构用来设定一段代码的执行指令declare用于执行3个指令:ticks,encoding,strict_typesdeclare结构用于全局范围,影响到其后的所有代码(但如果有declare结构的文件被其他文件包含,则对包含他的父文件不起作用&#x…...

嵌软工程师要掌握的硬件知识2:一文看懂什么开漏和推挽电路(open-drain / push-pull)
想了解开漏和推挽,就要先了解一下三极管和场效应管是什么,在其他章节有详细介绍,本文就不再进行赘述。 1 推挽(push pull)电路 1.1 理解什么是推挽电路 - 详细介绍 如图所示,Q3是个NPN型三极管,Q4是个PNP型三极管。 1)当Vin电压为正时,上面的N型三极管控制端有电…...

1.2.6存储结构-磁盘管理:单缓冲区与双缓冲区读取、流水线周期、计算流水线执行时间
1.2.6存储结构-磁盘管理:单缓冲区与双缓冲区读取、流水线周期、计算流水线执行时间流水线周期计算流水线执行时间微秒,时间单位,符号μs(英语:microsecond ),1微秒等于百万分之一秒(…...

【pytest接口自动化测试】结合单元测试框架pytest+数据驱动模型+allure
api: 存储测试接口 conftest.py :设置前置操作 目前前置操作:1、获取token并传入headers,2、获取命令行参数给到环境变量,指定运行环境commmon:存储封装的公共方法 connect_mysql.py:连接数据库http_requests.py: 封装…...

展锐平台WIFI吞吐问题解决方案
同学,别退出呀,我可是全网最牛逼的 WIFI/BT/GPS/NFC分析博主,我写了上百篇文章,请点击下面了解本专栏,进入本博主主页看看再走呗,一定不会让你后悔的,记得一定要去看主页置顶文章哦。 一、Wi-Fi 吞吐验收标准 预置条件:屏蔽房;DUT 距离 AP 1m 左右;测试 AP 不加密;…...

全局向量的词嵌入(GloVe)
诸如词-词共现计数的全局语料库统计可以来解释跳元模型。 交叉熵损失可能不是衡量两种概率分布差异的好选择,特别是对于大型语料库。GloVe使用平方损失来拟合预先计算的全局语料库统计数据。 对于GloVe中的任意词,中心词向量和上下文词向量在数学上是等…...