学习环境: Centos7 mysql8
开篇将告诉同学们这几件事:
1、为什么设计本课程?课程将帮助你Get到什么。
2、课程适合人群?针对特定的人将收获什么。
3、课程提供什么样的服务?如:查漏补缺问题库、答疑服务、QQ群人脉资源...
4、课程内容有哪些?通过思维导图,直观清晰呈现课程所涵盖丰富内容。
5、课程学习的路线/个人成长路线是怎样的?
本课程期望平滑过度到高级模式
技术选型,带大家从一开始就高起点,赢在起跑线上。本章主要内容就是来比较一下常见的两种数据存储系统关系型数据库和非关系型数据库的主要特点,以及他们各自适用的场景,让我们在做出选择时不再迷茫。
问题: 如何做数据库选型?
按照操作方式分为:
SQL(使用SQL语言操作数据的): Mysql Oracle SQLServer PostGreSQL
NoSQL, not only SQL (不仅仅使用SQL语言操作数据):MongoDB Redis Hadoop HBase
NoSQL 和 SQL都有其擅长的领域
关系数据库的特点:
1. 数据结构化存储在二维表中。支持关联操作(现在部分NoSQL也支持关联,不过仅限于json类型)
2. 支持事务的ACID特性
3. 支持使用SQL语言对存储在其中的数据进行操作。
适用场景:
1. 数据之间存在一定关系,需要关联查询的数据场景
2. 需要严格的对事务支出的场景
3. 需要使用SQL语言支持的场景
非关系型数据库的特点:
1. 存储结构灵活, 没有固定的结构
2. 事务支持比较弱,因为不需要对数据的完整性做检查,对数据的并发处理性能高。 很适合做日志记录
3. 大多不适用SQL语言操作数据
4. 存储大小比关系型数据库的大
适用场景:
1. 适合对数据完整度不高,读写并发较大的场景
2. 数据机构不固定的场景 -- 比如日志场景
3. 因为不支持sql语言, 适合对数据操作比较简单的场景
数据库使用的排名
mysql的可扩展性
支持基于二进制日志的逻辑复制
存在多种第三方数据库中间层. 支持读写分离
mysql的安全性和稳定性
mysql可以主从复制集群可达到90%的可用性
mysql数据进行安全分级控制
mysql支持win和linux系统
mysql有社区版本,是免费的。 和收费版的区别主要是工具方面, 而且使用人员众多,生态好
https://www.virtualbox.org/wiki/Downloads
新建虚拟电脑 => 填写名称 => 类型是redhat => 选择虚拟机位置(d:/)=> 选择20G(动态分配) => 添加镜像
=> 然后设置: 网络选择桥接网卡 => 存储选择iso文件 => 最后启动无脑下一步即可
填写centos的密码等操作 => 然后reboo 完成整个centos的安装
# 配置网络:
cd /etc/sysconfig/network-scripts/
sudo vim ifcfg-enp0s3
# 修改一些配置
BOOTPROTO=none
IPV6INIT=no
ONBOOT=yes
IPADDR=192.168.1.10
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
DNS1=8.8.8.8
# wq保存
# 修改下主机名 https://www.cnblogs.com/yinfutao/p/10620035.html
vi /etc/hostname
# 或者使用这个命令
hostnamectl set-hostname cenos7-a
# 重启
reboot
https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.15-linux-glibc2.12-x86_64.tar.xz
wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.15-linux-glibc2.12-x86_64.tar.xz
tar xvf mysql-8.0.15-linux-glibc2.12-x86_64.tar.xz
mv mysql-8.0.15-linux-glibc2.12-x86_64 /usr/local/mysql
# 建立mysal用户
adduser mysql
# 配置mysql (data, undo等目录)
vim /etc/my.cnf
cd /usr/local/mysql
mkdir data sql_log undo
chown mysql:mysql -R data sql_log undo
vi /etc/profile
export PATH=$PATH:/usr/local/mysql/bin
# 初始化mysql
mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
# 启动msyql服务
cd support-files/
cp mysql.server /etc/init.d/mysqld
/etc/init.d/mysqld start
ps ef | grep mysql
#查询初始密码
cd sql_log/
grep password mysql-error.log
# 登录mysql
mysql -uroot -p
# 修改root密码
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456'
# 重新登陆
mysql -u root -p
本章节“三部曲”,程序猿的必备技: 1、前奏:【业务分析】欲善其事,必三思而行; 2、高潮:【逻辑设计】范式化VS反范式化; 3、结束:【物理设计】存储引擎&数据类型&命名规约。
1.业务分析。
2.逻辑设计。
3.数据类型。
4.对象命名。
5.建立库表。
模仿慕课网。
要根据功能点,分析出需要哪些表,哪些实体
确定这些实体对应的属性:
课程的属性。主标题,副标题。方向分类,难度,最新最热产品,时长等
课程里列表的属性
讲师的属性
问答评论属性。
笔记属性。
用户的属性。
评价的属性
宽表模式就是所有的属性都写在一张表
宽表模式存在的问题:
数据冗余,相同的数据在一个表里面出现了多次。
数据更新异常:修改一行中某列的值时,同时修改了多行数据。
数据插入异常:部分数据由于缺失主键信息而无法写入表中。
数据删除异常:删除某一数据时,不得不删除另一数据。
配合列存储的数据报表应用。
表中的所有字段是不可以再分的。
比如 联系方式 这个字段,还可以在分为 电话 邮箱 微信。 那么联系方式这个字段就是违反了第一范式的
表中必须存在业务主键,并且非主键依赖于全部业务主键。业务主键指的不是Id,而是一个能够标识一条记录唯一的单列和多列的组合。
比下面这个表就不符合第二范式
笔记表:
用户 章节 标题 内容 用户积分 时间
笔记表的业务主键是 : 用户 章节 和标题 组成的复合主键
其中 ”用户积分“ 只依赖于 用户这个字段, 没有依赖于全部的业务主键。 因此就违反了第二范式
表中的非主键列之间不能相互依赖。(满足前两个凡事依然不能解决数据冗余的问题)
课程表:
主标题(pk) 方向 分类 难度 讲师名 讲师职位 综合评分
其中 讲师职位 是依赖于 讲师名的, 所以不符合第三范式
对课程对象表进行逻辑建模。
分析属性: 主标题 副标题 方向 分类 难度 最新 最热 时长 简介 人数 需知 收获 讲师昵称 等等
根据三范式限制,将属性分到不同表:
课程表
分类表: 分类不完全是课程表的属性,不满足第二范式, 所以可以单独提出来
讲师表: 讲师不完全是课程表的属性,不满足第二范式, 所以可以单独提出来
课程列表对象进行建模。
在进行属性定义的时候,要注意要满足数据库的第三设计范式,非主键之间不能够有相互依赖。
符合范式化的表可以尽可能的减少数据的冗余,也避免的写操作的异常出现脏数据的情况
但是: 数据表中关联表建议不要太多,填表操作会增大数据库的开销。
比如课程表和课程章节表,如果在一起是不满足第三范式的,但是为了保证性能上的开销,增加了章节的冗余。
用空间来换取时间 还是挺划算的。
进行了反3范式设计后现有逻辑模型的优化。为的就是减少关联表的数量, 但是也需要掌握一个度。 避免宽表模式带来的问题。
MYISAM mysql5.6之前的默认引擎,最常用的非事务性存储引擎
使用堆的数据结果存储,因为不用从索引中读取, 也不用单独维护索引。所以读写效率高。 但是因为读写会锁表, 对频繁读取可能会阻塞。
CSV 以csv格式存储的非事务型存储引擎,甚至可以直接修改文件,来修改某个数据
Archive 只允许查询和新增数据,而不允许修改的非事务存储引擎。
memory 是一种存储在内存中易失性的非事务性存储引擎。
Innodb 最常用的事务型存储引擎。
事务性存储引擎支持ACID(原子性,一致性,独立性,永久性)。
数据按主键聚集存储。(业务主键可能不适合innodb的主键,一般使用一个自增id列在作为逻辑主键)
支持行级锁及MVCC
支持Btree和自适应的Hash索引
5.6之后支持全文和5.7之后空间索引
给课程表增加自增id
自增ID可以保证数据的物理顺序。表之间的关联也可以使用物理主键关联,来增加效率
给剩下的表都加上了自增id
是否有符号: SIGNED UNSIGNED
int(2) :注意: int 括号里面写个2是不会节约数据存储空间的。
TINYINT :1字节
SMALLINT :2字节
MEDIUMINT : 3字节
INT : 4字节
BIGINT : 8字节
FLOAT 4字节 不是精确类型
DOUBLE 8字节 不是精确类型
DECIMAL 每4字节存9个数字,小数点占一个字节。 是精确类型。 存储空间大
123456789.987654321 = decimal(18, 9) 占9字节(小数点占1个字节,整数部分和小数部分各占4个字节), 最多允许存65个数字
用double类型和decimal类型 sum对比。发现double型求和是不准确的
create database test;
use test;
create table t(d1 DOUBLE,d2 decimal(10,3));
insert into t values(11.2,11.2),(2.56,2.56),(9.01,9.01),(132.33,132.33);
select * from t;
select sum(d1), sum(d2) from t;
DATE 3字节 YYYY-MM-DD
TIME 3-6字节 HH:MM:DD[,微秒值] 如果有微秒值,多占1~3个字节。
微秒 存储空间
0 0bytes
1,2 1 bytes
3,4 2 bytes
5,6 3 bytes
举例:
time 15:18:30
time(2) 15:18:29.72
time(4) 15:18:29.7182
time(6) 15:18:29.718216
YEAR 1字节 YYYY (比使用char或者varchar占用的字节更少)
DATETIME 5-8个字节 YYYY-MM-DD HH:MM:SS[.微秒值]
这个占用空间是变动的,原因和TIME类型一个原理
TIMESTAMP 4-7字节 YYYY-MM-DD HH:MM:SS[.微秒值] 相对于DATETIME 存储范围小
create table t_timestamp(dt TIMESTAMP );
insert into t_timestamp select now();
select * from t_timestamp;
# TIMESTAMP 类型: 会根据时区不同而值会变化
set time-zone=‘+10:00’
select now()
select * from t_timestamp;
CHAR(M) M = 1-255个字符 固定长度
VarChar(M) 一行中所有varchar类型的列所占用综合最大65535个字节。 其中M=多少个字符
比如 UTF8mb4 的varchar(10) 就占用了 40个字节
TinyText 最大是255个字节
Text 最大是65535个字节
MediumText 最大是16777215个字节(16M)
LongText 最大是4294967295个字节(4g)
Enum 枚举类型, 最大有65535个数目
优先选择符合存储数据需求的最小数据类型。
# 1. 比如使用无符号的int 就可增加一倍的容量
# 2. 将字符串转化为数字
INET_ATON('255.255.255.255' )= 4294967295
INET_NOTA(4294967295) = '255.255.255.255'
谨慎使用ENUM,TEXT 字符串类型
msyql 查询内存映射表,不包括Text类型。 因此在索引时会使用磁盘映射表
Text要使用前缀索引
Text也没有默认值
ENUM本身是一个字符串, 但是使用整数形式存储的。
ENUM优点:因为是整数存储,节约空间和查询效率
ENUM缺点:但是业务中如果需要增加enum的话, 需要alter修改表的结构
和财务相关的数据类型必须使用int或者decimal。
所有数据库对象名称必须使用小写字母,可选用下划线分割。
所有数据库对象名称禁止使用MySQL保留关键字。
在mysql 的官网上搜索 keywords and reserved words 查询保留关键字
数据库对象命名要能做到见名识意,并且最好不要超过32个字。
临时库表必须以tmp为前缀, 以日期为后缀。
用于备份的库表必须以bak为前缀,并日期为后缀。
所有存储相同数据的列名和列类型必须一致。
数据库的逻辑设计规范。即3范式。反3范式。
物理设计:常用的存储引擎及其选择方法。
常用的数据类型及其选择方法。
如何为表只要选择合适的存储类型。
为表取一个好名字。
本章节不仅适用于各语言开发工程师,也适用于:1、关注数据的产品、运营;2、测试工程师;3、运维工程师。提供四类武器,各取所需: 【初级武器】MySQL客户端; 【神兵利器】常用GUI工具; 【高阶神器】MySQL驱动; 【必杀秘器】故障排查。
mysql -uroot -p
mysql -uroot -p -e "select user()";
自行安装, 连接即可
mysql连接器: Connector/ODBC, Connector/J
pip install PyMysql
本章品味独特,剑指Geek Style。围绕核心是“工作”,针对日常工作常用的知识。包含工作基本功+工作必备技,两大部分: 【工作基本功】DCL& DDL& DML; 【工作必备技 】常用函数
什么是SQL :一种描述性的语言。DSL
SQL语言的作用:对存储在RDBMS中的数据进行增删改查的操作。
常用的SQL语言的种类:DCL DDL DML TCL
DCL : data control language
建立数据库账号: create user
对用户授权: grant
收回用户权限: revoke
任务一:建立程序使用的数据库账号。
create user mc_class@'192.168.101.%' IDENTFIED WITH 'mysql_native_password' by '1234567'
#msyql账号是由user和host共同组成的
select user,host from mysql.user;
#查看帮助
help create user
create user mc_test@'192.168.101.%' IDENTFIED BY '1234567' WITH MAX_USER_CONNECTIONS 1;
show plugins
任务二: 给账户授权。
#show privileges;
Insert
Delete
update
Select
Execute
#查看授权帮助。
help GRANT
GRANT select(user,host) on mysql.user to mc_class@'192.168.1.%'
GRANT select on mysql.user to mc_class@'192.168.1.%';
GRANT select,insert on mysql.* to mc_class@'192.168.1.%';
GRANT命令的的注意事项:
使用GRANT命令授权数据库账户必须存在。
用户使用GRANT命令授权须具有grant option的权限
#查看幫助
\h grant
任务三: 回收用户权限。
help revoke
#增加权限
grant select,delete,insert,update on mysql.* to mc_class@'192.168.101.%'
#回收
revoke delete,insert,update on mysql.* from mc_class@'192.168.101.%'
DDL: data definition language
建立修改删除数据库: create/alter/drop database
建议修改删除表: create/alter/drop table
建立删除索引: create/drop index
清空表: truncate table = drop table + create table
重命名表: rename table
建立修改删除视图 : create/alter/drop view
任务一: 建立数据库
help create database
#重要参数; 字符集 和 引擎
create database imc_db
任务二: 建立数据库imc_db中的表
help create table
#重要参数 : 字符集 引擎, 没有设置就使用db上的
任务三: 修改表
help alter table
alter table {tablename} add ..
alter table {tablename} change ..
alter table {tablename} modify ..
alter table {tablename} drop ..
alter table {tablename} raname ..
任务四: 删除表结构和数据
help drop table
drop tablename1, tablename2...
auto_increment 自增属性
not null 非空属性
default 默认属性
common 备注属性
unsigned 无符号属性
unique key udx_usernick (user_nick) 唯一键属性
Primary key (class_id) 主键属性
任务三: 维护表中的索引
help create index
create [unique] index index_name on tb_name (index_col_name...)
drop index index_name on tbl_name
清空表: truncate table imc_note
重命名: rename table imc_note to imc_note2
本章带你玩转SQL开发,学习其实可以很快乐哦。围绕核心是“工作”较为高阶技能和加薪技能,主要是如下两部分: 【工作高阶技】With语句; 【工作加薪技】窗口函数。
DML : DATA MANIPULATION LANGUAGE
help insert into
help delete
help update
help select
任务一: 插入一条数据
编写insert语句的思路
insert哪张表?
哪些字段不能为空?show create table
确认对应插入列的插入值的清单。
insert into imc_class(class_name) values ('mysql'), ('redis'), ('mongoDB')
CREATE UNIQUE INDEX uqx_classname on imc_class(class_name);
insert into imc_class(class_name) values('mysql') on duplicate key update add_time = CURRENT_TIME;
help select
#select_expr
select 'hello', 'mysql', '2018+1'
#最好不要使用*
select * from imc_db.user
#where 自句
select name from imc_db.user where name like '%东%'
编写查询语句的思路:
首先要确定我们过去的数据存在哪些表中: from
其次要确定我们要取哪些列
确认是否需要对表中的数据进行过滤: where
like 就是运算符
比较运算符:
>
<
!=
=
between and
is null
is not null
like
not like --- 通配符: % 和 _
in
not in
逻辑运算符:
and , &&
or, ||
xor : 异或, 两边要一真一假, 才为真
表与表之间要存在一定的关联关系
join:
inner join
outer join :
left join
rigit join
group by … having
show variables like 'sql_mode'
常用的聚合函数:
count(*) / count(col)
count(distinct user_id)
sum(col)
avg(col)
max(col)
min(col)
help create view {viewname} as
delete a
from imc_type a
join (
select type_name, min(type_id) as min_type_id, count(*)
from imc_type
group by type_name having count(*) > 1
) b on a.type_name = b.type_name and a.type_id > min_type_id;
#展示警告信息
show warnings;
系统函数:
#时间函数
select CURDATE() , CURTIME(),NOW()
#格式化时间 DATE_FORMAT(date, fmt) %Y %M %d %H %i %s
select DATE_FORMAT(NOW(), '%Y:%M')
#时间戳转换:
sec_to_time(second)
time_to_sec(time)
#相差的天数
DATEDIFF(NOW(), '1970')
#计算
date_add(now(), interval 1 day)
#截取
extract(year from now());
#其他
UNIX_TIMESTAMP()
FROM_UNIXTIME()
#常用的字符串函数
#连接
CONCAT(str1, str2...)
CONCAT_WS(sep, str1, str2... )
#长度
char_length
length
FORMAT(123456.789, 4)
#四捨五入
round(x,d)
#随机数
rand()
#case when
case when [cond]
then result
[when [cond] then result ..]
[ELSE result]
END
#MD5值
MD5()
在可读性和性能上都优于子查询
mysql8.0之后的版本才可以使用。
CTE生成一个命名临时表,并且只在查询期间有效。
CTE临时表在一个查询中可以多次引用及自引用。
错误1: 使用count(*)判断是否存在符合条件的数据。很耗性能
代替: 使用select … limit 1
错误2: 在执行一个更新语句后,使用查询方式判断此更新语句是否执行成功。
代替: 使用ROW_COUNT() 函数判断修改行数
错误3: 试图在ON条件中过滤不满足条件的记录。
SELECT from imc_class a join imc_course b
on b.class_id = a.class_id and a.class_id = 5
代替:
SELECT from imc_class a join imc_course b
on b.class_id = a.class_id where a.class_id = 5
错误4: 在使用IN进行子查询判断时,在列中为指定正确的表名。
#这样的查询会查出A表中所有的数据。
SELECT A1 FROM A where A1 IN (SELECT A1 from B)
代替1:
SELECT A1 FROM A where A1 IN (SELECT B.A1 from B)
代替2:
使用join
如何使用DC l语句来管理数据库的访问
如何使用DDL语句来建立数据库对象。
如何使用DML语句来操作数据库中的数据
常用的系统函数。
开发中易犯的错误。
武以快为尊。同理,快速高效工作,同样的工作时长,却创造更多企业价值,凸显个人价值,才能立于不败之地。 本章将从专家的视角,为你揭开SQL优化神秘面纱,解锁SQL优化的升职加薪技能。让你在工作中比别人技高一筹,助你在工作中对SQL优化,慢查询优化能有独到的企业级解决方案,为你的高薪保驾护航。
首先要有良好的数据结构设计
发现问题
分析执行计划
优化索引
改写sql
数据库水平,垂直拆分。 搭建集群
用户主动上报应用性能问题
分析慢查询日志发现存在问题的sql
show variables like 'long_query_time';
show variables like 'slow_query_log';
show variables like 'slow_query_log_file';
show variables like 'log_queries_not_using_indexes';
#mysql默认不会启动慢查询
set global slow_query_log = [ON|OFF]
set global slow_query_log_file = /sql_log/slowl.log
set global long_query_time = xx.xxx (秒)
set global log_queries_not_using_indexes = [ON|OFF]
#官方工具: mqsqldumpslow [OPTS...] [LOGS...]
mysqldumpslow /sql_log/slowl.log
#其他工具: pt-query-digest [OPTIONS] [FILES] [DSN]
pt-query-digest /sql_log/slowl.log
数据库实时监控
通过慢查询日志的方式缺点:不能都实时监控,需要一定的周期
有个监控长时间运行的sql:
select id, user, host, DB, command, time, state, info from information_schema.PROCESSLIST where TIME>60
EXPLAIN作用:
1. 了解sql如何访问表中的数据。
2. 了解sql如果使用表中的索引。
3. 所使用的查询类型。
结果分析:
id的值代表执行顺序: 由大到小执行
select_type:
SIMPLE: 不包含子查询或者UNION操作的查询
PRIMATY: 查询中如果包含子查询,那么最外层的查询则被标记为PRIMARY
SUBQUERY: SELECT列表中的子查询
DEPENDENT SUBQUERY: 依赖外部结果的子查询
UNION: union操作的第二个或是之后的查询的值为union
table:
输出的表的名称或者别名
partitions 分区表id
对于分区表, 显示查询的分区ID
对于非分区表, 显示NULL
type 连接类型:
NULL ---- 很少见
system 这个是const连接类型的一个特例, 当查询的表只有一行时使用
const
eq_ref
ref
ref_or_null
index_merge
range
index
ALL
性能从高到底
possible_key : 查询中可能会遇到的索引;
key :实际使用到的索引
key_len: 使用索引的最大长度。(所以在定义表结构时要最短的长度, 因为会影响到执行计划)
ref: 指出哪些列或常量被用于索引的查找
row: 根据统计信息预估的扫描的行数, (如果是关联查询次数 就是每张表的row值乘积)
filtered: 预估扫描行数中命中结果的百分比
Extra:
Distinct: 优化distinct操作。 在找到第一匹配的元组后就停止查找
Not exitst: 使用了not exitst优化
using index : 使用了覆盖索引(直接读取的索引,没有访问数据资源)优化
本章针对面试中高频考点:索引优化进行讲解,让你面试无忧,直接向面试开炮,甚至吊打面试官
1. 优化索引
2. 改写sql达到更好的利用sql
mysql的索引是在存储引擎这一层来实现的,而不是在服务层实现的,所以不同的引擎对应的索引的工作方式可能是不同的:
Btree索引
自适应HASH
全文索引
空间索引
适用于全值匹配的查询 : class = ‘mysql’ 或者 class in(‘mysql’, ‘postSql’)
适用于范围查找between > <
Btree 索引从索引的最左侧列开始匹配查询
基于Btree索引的特点可能不会命中索引的场景:
1. 比如 create index idx_title_studyCnt on imc_course(title, study_cnt)
#使用索引的顺序不可以乱
study_cnt > 300 (不能使用到索引)
title = 'Mysql' (可以)
title = 'Mysql' and study_cnt > 300(可以)
study_cnt > 300 and title = 'Mysql' (也是可以的,mysql做了一定的优化)
2. create index idx_a_b_c on imc_test(a,b,c)
#不能跳过索引
a = 1 and c=2 (只会命中a)
3. NOT IN 和 <> 操作无法使用索引
4. 索引列上不能使用表达式或者函数
where 子句中的列(注意只需要建立在筛选性低的列上)
包含在order by group by distinct中的列,提高排序性能:
1. 索引列的顺序和orderby的顺序要一致
2. 索引列的升序和降序也要和orderby一致
3. 在关联查询时候orderby的字段要全部在关联查询的第一张表中
多表JOIN的关联列
每个执行计划中:
type: 都要使用到索引
row: 扫描的行数降到最低
filtered: 预估扫描行数中命中结果的百分比越高越好
1. 区分度最高的列放在联合索引的最左侧
2. 最频繁使用的列放在最左侧
3. 尽量把字段的长度小的列放在联合索引列的最左侧
索引越多越好?
1. 增加写入维护开销
2. 如果遇到很多索引都可以使用,会增加mysql查询优化器生成执行计划的计算时间
使用IN列表查询不能用到索引?
其实是可以全值匹配,使用到索引的
查询过滤顺序必须同索引键的顺序相同才可以使用到索引?
mysql查询优化器可以自动调整顺序
1. 使用left join where filed is null 代替 not in
select class_name
from imc_class
where class_id not in (select class_id from imc_course);
select class_name
from imc_class a
left join imc_course b on a.class_ia = b.class_id
where b.class_id is null
使用CTE代替子查询
拆分复杂的大sql为多个简单的小sql
巧用计算列优化查询
select * from imc_classvalue where (content_count+level_count+view_cnt) > 28;
#mysql5.7之后可以增加计算列
alter table imc_test add column total int(10) as (content_count+level_count+view_cnt)
create index idx_total on imc_test(total)
什么是事务
事务是数据库执行操作的最小逻辑单元
可以有一个sql或多个sql组成
组成事务的sql要满足原子性
事务的acid特性
原子性
一致性
隔离性(并发控制)
持久性
并发带来的问题
脏读: 事务a读取到了事务b未提交的数据。事务b最后又回滚了。
不可重复读: 事务a第二次读时,事务b提交了修改。导致事务a前后读取的统一数据不一致
幻读: 它是不可重复读一个变种,事务a前后两个读的数据总数不一致。 事务a第二次读时,事务b插入了一条新数据
顺序读(SETIALIZABLE)
可重复读(Repa)
读已提交
读未提交
设置隔离级别:
help set
set SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
show variables like '%iso%'
阻塞的原因:
共享锁:
排他锁:
事务上使用了排它锁
查看连接ID:
select CONNECTION_ID()
kill 连接
优化sql占用资源事务的sql,使其尽快释放资源
如何发现死锁:
set global innodb_print_all_deadlocks=on;
如何处理死锁:
1. 其实mysql会自行回滚占用资源少的事务
2. 并发的事务按照相同的顺序占有资源
本章进行课程所有内容的梳理,总结回顾。提炼精华,再现经典。帮助同学们快速梳理,巩固升华,达到融会贯通,学以致用到工作所需中