1.事务ACID
- 原子性(atomicity)一个事务必须被视为一个不可分割的最小工作单元,整个事务中所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作;
- 一致性(consistency)数据库总是从一个一致性的状态转换到另外一个一致性的状态;
- 隔离性(isolation)一个事务所做的修改在最终提交以前,对其他事务是不可见的;
- 持久性(durability)一旦事务提交,则其所做的修改就会永久保存到数据库中。
2.四种隔离级别
- READ UNCOMMITTED(未提交读),事务中的修改,即使没有提交,对其他事务也都是可见的,事务可以读取未提交的数据,也被称为脏读(Dirty Read),这个级别会导致很多问题;
- READ COMMITTED(提交读),大多数数据库系统的默认隔离级别,一个事务开始时,只能“看见”已经提交的事务所做的修改,一个事务从开始直到提交之前,所做的任何修改对其他事务都是不可见的,也叫不可重复读(nonrepeatable read),有可能出现幻读(Phantom Read),指的是当某个事务在读取某个范围内的记录时,另外一个事务又在该范围内插入了新的记录,当之前的事务再次读取该范围的记录时,会产生幻行(Phantom Row);
- REPEATABLE READ(可重复读),通过InnoDB和XtraDB存储引擎,是MySQL的默认事务隔离级别;
- SERIALIZABLE(可串行化)最高级别,通过强制事务串行执行,避免了幻读问题,会在读取的每一行数据上都加锁,可能导致大量的超时和锁争用的问题。
3.MySQL存储引擎
- InnoDB事务型数据库的首选引擎,支持ACID事务,支持行级锁定, MySQL 5.5 起成为默认数据库引擎
- MyISAM基于ISAM存储引擎,并对其进行扩展。它是在Web、数据仓储和其他应用环境下最常使用的存储引擎之一。MyISAM拥有较高的插入、查询速度,但不支持事物。是MySQL 5.0 之前的默认数据库引擎。
- Memory存储引擎将表中的数据存储到内存中,拥有极高的插入,更新和查询效率。但是会占用和数据量成正比的内存空间。并且其内容会在 MySQL 重新启动时丢失。
存储引擎的选择
不同的存储引擎都有各自的特点,以适应不同的需求,如下表所示:
功 能 | MYISAM | Memory | InnoDB | Archive |
---|---|---|---|---|
存储限制 | 256TB | RAM | 64TB | None |
支持事物你 | No | No | Yes | No |
支持全文索引 | Yes | No | No | No |
支持数索引 | Yes | Yes | Yes | No |
支持哈希索引 | No | Yes | No | No |
支持数据缓存 | No | N/A | Yes | No |
支持外键 | No | No | Yes | No |
如果要提供提交、回滚、崩溃恢复能力的事物安全(ACID兼容)能力,并要求实现并发控制,InnoDB是一个好的选择
如果数据表主要用来插入和查询记录,则MyISAM引擎能提供较高的处理效率
如果只是临时存放数据,数据量不大,并且不需要较高的数据安全性,可以选择将数据保存在内存中的Memory引擎,MySQL中使用该引擎作为临时表,存放查询的中间结果
如果只有INSERT和SELECT操作,可以选择Archive,Archive支持高并发的插入操作,但是本身不是事务安全的。Archive非常适合存储归档数据,如记录日志信息可以使用Archive
使用哪一种引擎需要灵活选择,一个数据库中多个表可以使用不同引擎以满足各种性能和实际需求,使用合适的存储引擎,将会提高整个数据库的性能
查看系统支持的存储引擎:show engines;
查看当前默认的存储引擎:show variables like '%storage_engine%';
查看某个表使用的存储引擎:show create table table_name;
修改表引擎:alter table table_name engine=innodb;
关闭MySQL:mysqladmin -u root -p shutdown
连接MySQL:mysql -u root -h localhost -p
创建数据库:create database db_name;
查看: show databases;
选择:use db_name;
查看当前use了哪个库:select database();
创建表: create table user(
id int not null auto_increment comment '主键,自增',
name varchar(40),
PRIMARY KEY (id
)) ENGINE=InnoDB DEFAULT CHARSET=utf8;
查看所有表:show tables;
查看表结构:desc db_name;
修该表所用的字符集:alter table table_name character set utf8;
重命名表:rename table old_table_name to new_table_name;
删除表:drop table table_name;
主键约束 primary key
主键约束 主键列的数据类型不限,但此列必须是唯一并且非空。当创建主键的约束时,系统默认会在所在的列和列组合上建立对应的唯一索引。
创建主键约束
create table temp(
id int primary key,
name varchar(20)
);
添加主键约束:alter table temp add primary key(id,name);
外键约束 foreign key
外键约束是保证一个或两个表之间的参照完整性,外键是构建于一个表的两个字段或是两个表的两个字段之间的参照关系
-- 主表
create table temp(
id int primary key,
name varchar(20)
);
-- 副表
create table temp2(
id int,
name varchar(20),
classes_id int,
foreign key(id) references temp(id)
);
多列外键组合,必须用表级别约束语法
-- 主表
create table classes(
id int,
name varchar(20),
number int,
primary key(name,number)
);
副表
create table student(
id int auto_increment primary key,
name varchar(20),
classes_name varchar(20),
classes_number int,
/表级别联合外键/
foreign key(classes_name, classes_number) references classes(name, number)
);
删除外键约束:alter table student drop foreign key student_id;
增加外键约束:alter table student add foreign key(classes_name, classes_number) references classes(name, number);
唯一约束unique
唯一约束是指定table的列或列组合不能重复,保证数据的唯一性。
创建唯一约束:创建表时设置,表示用户名、密码不能重复
create table temp(
id int not null ,
name varchar(20),
password varchar(10),
unique(name,password)
);
添加唯一约束:alter table temp add unique (name, password);
修改唯一约束:alter table temp modify name varchar(25) unique;
删除约束:alter table temp drop index name;
非空约束 not null 与 默认值 default
非空约束用于确保当前列的值不为空值,非空约束只能出现在表对象的列上。
创建非空约束:创建table表,ID 为非空约束,name 为非空约束 且默认值为abc
create table temp(
id int not null,
name varchar(255) not null default 'abc',
sex char null
);
增加非空约束:alter table temp modify sex varchar(2) not null;
取消非空约束:alter table temp modify sex varchar(2) null;
取消非空约束,增加默认值:alter table temp modify sex varchar(2) default 'abc' null;