mysql个人随手笔记
第一章、mysql原理知识点
1.1 ACID特性
A:原子性:语句要么全执行,要么全不执行,是事务最核心的特性,事务本身就是以原子性来定义的;实现主要基于undo log。
C:一致性:事务追求的最终目标,一致性的实现既需要数据库层面的保障,也需要应用层面的保障。
I :隔离性:保证事务执行尽可能不受其他事务影响;InnoDB默认的隔离级别是RR,RR的实现主要基于锁机制(包含next-key lock)、MVCC(包括数据的隐藏列、基于undo log的版本链、ReadView)。
D:永久性:保证事务提交后不会因为宕机等原因导致数据丢失;实现主要基于redo log。
总结:事务的终极大 boss 一致性是通过原子性,持久性,隔离性来实现的。
原子性,持久性,隔离性折腾半天的目的也是为了保障数据的一致性!
总之,ACID只是个概念,事务最终目的是要保障数据的可靠性,一致性。
1.2 四层隔离性
1.2.1、读未提交:在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称之为脏读(Dirty Read)。
编者按:就好比还没确定的消息,你却先知道了发布出去,最后又变更了,就是说瞎话了。常说的脏读,读到了还未提交的。
1.2.2、读已提交:这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这种隔离级别 也支持所谓的不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一select可能返回不同结果。
编者按:只能读取到已经提交的事务。
1.2.3、可重复度:这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手的问题:幻读 (Phantom Read)。简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题。
编者按:幻读。读到已提交的数据。
1.2.4、串行化:这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。
编者按:事务顺序执行,没有并行,完全杜绝幻读。
这四种隔离级别采取不同的锁类型来实现,若读取的是同一个数据的话,就容易发生问题。例如:
脏读(Drity Read):某个事务已更新一份数据,另一个事务在此时读取了同一份数据,由于某些原因,前一个RollBack了操作,则后一个事务所读取的数据就会是不正确的。读取到未提交事务的数据。读取阶段。
不可重复读(Non-repeatable read):在一个事务的两次查询之中数据不一致,这可能是两次查询过程中间插入了一个事务更新的原有的数据。
幻读(Phantom Read):在一个事务的两次查询中数据笔数不一致,例如有一个事务查询了几列(Row)数据,而另一个事务却在此时插入了新的几列数据,先前的事务在接下来的查询中,就有几列数据是未查询出来的,如果此时插入和另外一个事务插入的数据,就会报错。读取到新提交的数据,发生在插入阶段。
1.3 其他原理知识
存储引擎:
inoodb引擎:不支持全文搜素
mymsl引擎:支持全文搜索
第二章、mysql语句知识点
2.1、数据库操作
2.1.1、选择数据库,再进行其他操作
use db_name
2.1.2、增(创建库)
create database db_name
2.1.3、删(删除库)
drop database db_name
2.1.4、改(修改-数据库名称)
rename database db_name to new_db_name
2.1.5、查(显示-所有数据库)
show databases
2.2、数据表操作
2.2.1、增(创建-新表)
create table table_name(
id int,
name varchar(10),
stu_sex VARCHAR(1),
stu_age INT,
stu_class VARCHAR(20)
);
简单新建表的格式,不存在主键,不指定数据库存储引擎
增(新增-表列)
增加一个列名
alter table table_name add 列名 类型(默认最后列添加)
alter table table_name after 列名 类型(在之后添加)测试报错
alter table table_name before 列名 类型(在之前添加)测试报错
alter table table_name first 列名 类型(在第一列添加)测试报错
alter table table_name end 列名 类型(在最后添加)测试报错
请在实操下进行验证测试
增(往表内数据插入)
1、单个选择插入
insert into 表名(列名1,列名2,列名,3…) values(值1,值2,值3,…)
注意:字符类型是varchar,values值要加双引号。负责数据库解释错误,会报错。
2、批量插入
insert into 表名 values(值1,值2,值3,…),(值1,值2,值3,…),(值1,值2,值3,…)…批量插入
2.2.2、删(删除表)
drop table table_name
删(删除表的列 )
alter table table_name drop 列名
删(删除表中数据 )
delete from 表名 where 列名=‘范围’
2.2.3、改(修改列名)
alter table table_name change 旧列名 新列名 类型
改(修改列类型)
alter table table_name modify 列名 新的类型
改(修改表中内容)
update 表名 set 列名=‘vaule’ where 列名=‘范围’
2.2.4、查(查看表的属性)
desc table_name
查(选择查询表内容)
select * from 表名 where 范围
查(完全查询表内容)
select * from 表名
查(模糊查询表内容)
select * from 表名 where 列名 like ‘%value%’
查(排序查询表内容)
select * from 表名 order by 列名 desc
六级标题
mysql命令补全的三种方法;
1、临时使用自动补全;mysql -u root -p -auto–rehash
2、永久自动补全;vim /etc/mycnf进入编辑
添加 :
[mysql]
auto-rehash
3、使用软件mycli自动补全;(以后自己单独研究)
yum install -y epel-release
epel-release可以比作是一个拥有丰富扩展软件包的源,安装后类似于第三方源
进入到/etc/yum.repod/中可以看到epel开头的repo
数据类型:
(1)整数型
tinyint 1字节
int 4字节
bigint 8字节
(2)浮点型
float 4字节 单精度浮点型
double 8字节 双精度浮点型
(3)定点型
decimal(M,D)
(4)字符串型
char 不管插入多长字节数据,所占空间是一定的
varchar 所占字节数为实际长度加1的字节
(5)文本类型(用于大文本数据,如文章内容、评论、详情等)
tinytext
text
longtext
(6)时间于日期类型
year 1字节 日期格式:YYYY
date 4字节 日期格式:YYYY-MM-DD
time 3字节 日期格式:HH:MM:SS
datetime 8字节 日期格式:YYYY-MM-DD HH:MM:SS
timestamp 4字节 日期格式:YYYY-MM-DD HH:MM:SS
(7)二进制类型
blob
再次学习数据库、数据表的基本操作
create datebase; 数据库名称
show create database; 数据库名称
drop database; 数据库名称
show datebases;
alter database 数据库名称 character set gbk;
修改数据库字符集为gbk
use db1;
select database();
show tables;
show create table student;