存储引擎
MySQL特有(Oracle对应的机制就叫”存储方式“),描述的是底层表的存储方式
通过 show create table [table_name]
查看表的存储引擎
1 2 3 4 5 6
| # 查看表的存储引擎 show create table emp; /* ... ENGINE=InnoDB DEFAULT CHARSET=utf8 */
|
完整的建表语句
1 2 3 4 5 6
| CREATE TABLE `[table_name]` ( `id` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf-8; # 在MySQL当中,凡是标识符都可以用飘号“`”括起来(不通用) # 建表时可以指定存储引擎,也可以指定字符集 # 默认引擎是 InnoDB,默认字符集是 utf-8
|
查看 MySQL 当前版本支持的存储引擎
1 2 3 4 5 6 7 8 9 10
| # 查看当前版本 select version(); /* +-----------+ | version() | +-----------+ | 5.5.28 | +-----------+ 1 row in set (0.01 sec) */
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
| # 查看存储引擎 show engines \G; /* *************************** 1. row *************************** Engine: FEDERATED Support: NO Comment: Federated MySQL storage engine Transactions: NULL XA: NULL Savepoints: NULL *************************** 2. row *************************** Engine: MRG_MYISAM Support: YES Comment: Collection of identical MyISAM tables Transactions: NO XA: NO Savepoints: NO *************************** 3. row *************************** Engine: MyISAM Support: YES Comment: MyISAM storage engine Transactions: NO XA: NO Savepoints: NO *************************** 4. row *************************** Engine: BLACKHOLE Support: YES Comment: /dev/null storage engine (anything you write to it disappears) Transactions: NO XA: NO Savepoints: NO *************************** 5. row *************************** Engine: CSV Support: YES Comment: CSV storage engine Transactions: NO XA: NO Savepoints: NO *************************** 6. row *************************** Engine: MEMORY Support: YES Comment: Hash based, stored in memory, useful for temporary tables Transactions: NO XA: NO Savepoints: NO *************************** 7. row *************************** Engine: ARCHIVE Support: YES Comment: Archive storage engine Transactions: NO XA: NO Savepoints: NO *************************** 8. row *************************** Engine: InnoDB Support: DEFAULT Comment: Supports transactions, row-level locking, and foreign keys Transactions: YES XA: YES Savepoints: YES *************************** 9. row *************************** Engine: PERFORMANCE_SCHEMA Support: YES Comment: Performance Schema Transactions: NO XA: NO Savepoints: NO 9 rows in set (0.01 sec) */
|
常见的存储引擎
MyISAM 引擎
1 2 3 4 5 6
| Engine: MyISAM Support: YES Comment: MyISAM storage engine Transactions: NO // 不支持事务 XA: NO Savepoints: NO
|
- 最常用的存储引擎,但不是默认的
- 具有以下特征:
- 使用三个文件表示每个表
- 格式文件 - 存储表结构的定义([table].frm)
- 数据文件 - 存储表行的内容([table].MYD)
- 索引文件 - 存储表上的索引([table].MYI)
- 灵活的 AUTO_INCREMENT 字段处理
- 可被转换为压缩、只读表来节省空间
InnoDB 引擎
Engine: InnoDB
Support: DEFAULT
Comment: Supports transactions, row-level locking, and foreign keys // 支持事务、行级锁、外键
Transactions: YES
XA: YES
Savepoints: YES
- MySQL 中缺省引擎,安全得到保障
- 具有以下特征:
- 每个 InnoDB 表在数据库目录中以 .frm 格式文件表示
- InnoDB 表空间 tablespace 被用于存储表内容
- 提供一组用来记录事务性活动的日志文件
- 用 COMMIT(提交)、SAVEPOINT、ROLLBACK(回滚)支持事务处理
- 提供全 ACID 兼容
- 在 MySQL 数据库崩溃后提供自动恢复
- 多版本(MVCC)和行级锁定
- 支持外键及引用的完整性,包括级联删除和更新
MEMORY 引擎
Engine: MEMORY
Support: YES
Comment: Hash based, stored in memory, useful for temporary tables
Transactions: NO
XA: NO
Savepoints: NO
- 缺点:不支持事务、数据容易丢失(所有数据和索引存储在内存)
- 优点:查询速度最快
- 具有以下特征:
- 在数据库目录内,每个表均以 .frm 格式的文件表示
- 表数据及索引被存在内存中
- 表级锁机制
- 不能包含 TEXT 或 BLOB 字段
以前叫做 HEAP 引擎
事务
一个事务是一个完整的业务逻辑单元,不可再分
多条 DML 语句捆绑一起,同时成功/同时失败
例如:银行账户转账,从 A 账户向 B 账户转账10000,需要执行两条 update 语句
1 2
| update t_act set balance = balance - 10000 where actno = 'act-01'; update t_act set balance = balance + 10000 where actno = 'act-02';
|
以上两条 DML 语句必须同时成功或同时失败
- 和事务相关的语句只有 DML 语句(insert delete updat)
- 事务的存在是为了保证数据的完整性、安全性
原理:
1 2 3 4 5 6 7
| 开启事务机制(开始)
执行 insert 语句:执行成功后,将执行记录到数据库的操作历史中,并不会向文件中保存一条数据,不会真正地修改硬盘上的数据 执行 ... 语句 ...
提交事务或回滚事务(结束)
|
- 提交事务:将历史操作同步到硬盘文件中,然后清空历史记录
- 回滚事务:直接清空历史记录
特性
事务包括四大特性:ACID
A 原子性:事务是最小的工作单元,不可再分
C 一致性:事务必须保证多条 DML 语句同时成功/失败
I 隔离性:事务 A 与事务 B 之间具有隔离性
D 持久性:最终数据必须持久化到硬盘文件才算成功结束
事务的隔离性
事务隔离性存在隔离级别,理论上隔离级别包括4个:
读未提交(read uncommitted)
对方事务还没有提交,当前事务可以读取到对方未提交的数据
- 问题:存在脏读(Dirty Read)现象:表示读到了脏的数据
读已提交(read committed)
对方事务提交之后的数据我方可读取到
可重复读(repeatable read)
可以重复读取我方当前事务的数据
序列化读/串行化读
事务同步提交,必须排队
Oracle 数据库默认的隔离级别是:第二级 读已提交
MySQL 数据默认的隔离级别是:第三级 可重复读
演示事务
MySQL 事务默认自动提交(只要执行一条 DML 语句则提交一次)
commit/rollback 演示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| # 关闭自动提交/开启事务 start transaction;
# DML 语句 # ... # 这里可以创建保存点 savepoint a1;
# 提交 commit;
# 或回滚 rollback; # 回滚到保存点 rollback a1;
|
设置隔离级别
设置事物的隔离级别:
1
| set global transaction isolation level read uncommitted;
|
查看事物的全局隔离级别:
1 2 3 4 5 6 7 8
| select @@tx_global isolation; /* +-----------------+ | @@tx_isolation | +-----------------+ | REPEATABLE-READ | +-----------------+ */
|
索引
相当于一本书的目录,通过目录可以快速找到对应资源
数据库查询表的两种检索方式:
- 全表扫描
- 索引检索(缩小扫描范围,效率高)
不能随意添加索引,索引也是数据库中的对象,也需要不断维护(维护成本),数据修改索引就需要重新排列
操作
添加索引是给某一个字段添加
添加索引:create index 索引名称 on 表名(字段名)
1
| create index emp_sal_index on emp(sal);
|
删除索引:drop index 索引名称 on 表名;
使用场景
- 数据量庞大(根据需求和环境)
- 该字段 DML 操作很少(字段修改,索引需要维护)
- 该字段经常出现在 where 字句中
主键和具有 unique 约束的字段会自动添加索引,所以尽量根据主键检索
模糊查询第一个通配符使用 % 时索引失效
实现原理
通过 B + Tree 数据结构缩小扫描范围,底层索引进行了排序、分区,索引会携带表中的“物理地址”,最终通过索引检索到数据之后,获取到关联的物理地址,通过物理地址定位表中瞬息,效率较高
索引分类
单一索引:单个字段添加索引
复合索引:多个字段联合添加一个索引
主键索引:主键自动添加索引
唯一索引:unique 约束字段自动添加索引
…
视图
同一张表的数据,通过不同的角度去看待
可以隐藏表的实现细节,保密级别较高的系统,数据库只对外提供相关视图,Java 程序员只对视图对象进行 CRUD
视图操作
创建视图:
create view 视图名称 as select 字段1, 字段2 from emp;
删除视图:
drop view 视图名称;
对视图的增删改查会影响到原数据