MySQL简介
- MySQL是一个关系型数据库管理系统
- 优点体积小、速度快、总体拥有成本低
常用命令
- SHOW CREATE DATABASE 数据库名 (查看创建数据库的语句)
- SHOW CREATE TABLE 表名 (查看创建数据表的语句)
- DESC 表名 (查看数据表结构)
MyISAM和InnoDB
- InnoDB默认使用,MyISAM早些年使用的
| MyISAM | InnoDB | |
|---|---|---|
| 事务支持 | 不支持 | 支持 |
| 数据行锁定 | 不支持 | 支持 |
| 外键约束 | 不支持 | 支持 |
| 全文索引 | 支持 | 不支持 |
| 表空间的大小 | 较小 | 较大,约为2倍 |
常规使用操作:
- MyISAM:节约空间,速度较快
- InnoDB:安全性高,支持事务处理,多表多用户操作
在物理空间存在的位置
所有的数据库文件都存在data目录下,本质还是文件的存储!
MySQL引擎在物理文件上的区别
- InnoDB在数据库中只有一个*.frm文件,以及上级目录下的 ibd 文件
MyISAM对应文件
- *.frm 表结构的定义文件
- *.MYD 数据文件(data)
- *.MYI 索引文件(index)
设置数据库表的字符集编码
CHARSET=utf7修改和删除表
-- 修改表名
ALTER TABLE 旧表名 RENAME AS 新表名
-- 增加表的字段
ALTER TABLE 表名 ADD 字段名 列属性
-- 修改表的字段
ALTER TABLE 表名 MODIFY 字段名 列属性[] -- 修改约束
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 列属性[] -- 字段重命名
-- 删除表的字段
ALTER TABLE 表名 DROP 字段名
-- 删除表(如果表存在再删除)
DROP TABLE IF EXISTS 表名所有的创建和删除操作尽量加上判断,以免报错~
注意点:
- 字段名使用``包裹!
- 注释 -- /**/
- sql关键字大小写不敏感,建议使用小写
- 所有符号用英文!
外键
联表查询
事务
什么是事务
要么成功,要么失败
例:
- SQL执行 A给B转账 A 1000 -> 200 B 200
- SQL执行 B收到A的钱 A 800 -> B 400
将一组SQL放在一个批次中执行
事务原则:ACID原则,原子性,一致性,隔离性,持久性(脏读,幻读···)
- 原子性表示,这上面两个步骤一起成功,或者一起失败,不能只发生其中一个动作
- 一致性表示,事务完成后,符合逻辑运算
- 持久性表示,事务结束后的数据不随着外界原因导致数据丢失,事务没有提及回复到原状,事务已经提交,持久化到数据库
隔离性表示,针对多个用户同时操作,主要是排除其他事务对这次事务的影响
- 脏读:指一个事务读取了另外一个事务未提交的数据
- 不可重复读:在一个事务内读取表中的某一行数据,多次读取结果不同(这个不一定是错误,只是某些场合不对)
- 虚读(幻读):指在一个事务内读到了别的事务插入的数据,导致前后读取不一致
执行事务
mysql默认开启事务自动提交
-- 手动处理事务
SET autocommit = 0 -- 关闭自动提交
-- 事务开启
START TRANSACTION -- 标记一个事务的开始
INSERT xx
INSERT xx
-- 提交: 持久化(成功)
COMMIT
-- 回滚: 回到原来的样子(失败)
ROLLBACK
-- 事务结束
SET autocommit = 1 -- 开启自动提交
-- 了解
SAVEPOINT 保存点名 -- 设置一个事务的保存点
ROLLBACK TO SAVEPOINT 保存点名 -- 回滚到保存点
RELEASE SAVEPOINT 保存点名 -- 撤销保存点步骤:
- 关闭自动提交
- 开启一个事务
- 成功就提交,失败就回滚
- 开启自动提交
索引
MySQL官方对索引的定义:索引(Index)是帮助MySQL高效获取数据的数据结构
索引的分类
主键索引(PRIMARY KEY)
- 唯一的标识,主键不可重复,只能有一个列作为主键
唯一索引(UNIQUE KEY)
- 避免重复的列出现,唯一索引可以重复,多个列都可以标识为唯一索引
常规索引(KEY/Index)
- 默认的,index/key关键字设置
全文索引(FullINDEX)
- 在特定数据库引擎才有,MyISAM
- 快速定位数据
索引的使用
-- 显示所有索引信息
SHOW INDEX FROM 表名
-- 增加一个全文索引
ALTER TABLE 数据库名.表名 ADD FULLTEXT INDEX `索引名` (`列名`);
-- EXPLAIN 分析sql执行状况
EXPLAIN SELECT * FROM 表名; -- 非全文索引
EPLAIN SELECT * FROM 表名 WHERE MATCH(索引名) AGAINST(匹配值);索引在小数据量的时候,用处不大,但是在大数据量的时候,区别十分明显
索引原则
- 索引不是越多越好
- 不要对经常变动的数据加索引
- 小数据量的表不需要加索引
- 索引一般加在常用的查询的字段上
索引的数据结构
- Hash类型索引
- Btree:InnoDB的默认数据结构
三大范式
- 第一范式,原子性
- 第二范式,满足第一范式的前提下,每张表只描述一件事
- 第三范式,满足第一和第二范式的前提下,需要确保数据表中的每一列数据都和主键直接相关,而不能简介相关
规范性和性能的问题
关联查询的表不得超过三张表
- 考虑商业化的需求和目标,数据库的性能更重要
- 在规划性能问题的时候,需要适当考虑一下 规范性
- 故意给某些表增加一些冗余字段,从多张表查询变为单表查询
- 故意增加一些计算列,从大数据量降低小数据量的查询:索引