- List item
- DCL(Data Control Language):数据控制语言 GRANT:授权
- DDL(Data Definition Language) :数据库定义语言 CREATE
- DML(Data Manipulation Language):数据操纵语言 INSERT UPDATE
- DQL(Data Query Language):数据查询语言 SELECT
事务并发问题
- 脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据
- 不可重复读-行锁:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致
- 幻读-表锁:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。
事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读未提交 | 是 | 是 | 是 |
不可重复读 | 否 | 是 | 是 |
可重复读 | 否 | 否 | 是 |
串行化 | 否 | 否 | 否 |
存储引擎
- 事务
如果应用需要事务支持,那么InnoDB(或者XtraDB)是目前最稳定并且通过验证的选择。如果不需要事务,并且主要是SELECT和INSERT操作,那么MyISAM是不错的选择,一般日志型比较符合这一特征。 - 备份
备份的需求也会音响存储引擎的选择。如何可以定期地关闭服务器来执行备份,那么备份的因素可以忽略。反之,如果需要在线热备份,那么选择InnoDB就是基本的要求。 - 崩溃恢复
数据量比较大的时候,系统崩溃如何快速恢复是一个需要考虑的问题。相对而言,MyISAM奔溃后发生虽坏的概率要比InnoDB高得多,而且恢复速度也要慢。因此,即使不需要事务支持,很多人也选择InnoDB引擎,这是一个非常重要的因素。 - 特有的特性
最后,有些应用可能依赖一些存储引擎所独有的特性或者优化,比如很多应用依赖聚簇索引的优化。另外,MySql中也只有MyISAM支持地理空间搜索。如果一个存储引擎拥有一些关键的特征,同时却又缺乏一些必要的特征,那么有时候不得不做折中的考虑,或者在架构上做一些取舍。 - 锁的竞争
调优
- 慢查询日志
- 使用show profile
- 使用show status/ explain *
- 使用show global status *
- 使用show processlist
数据类型
- timestamp和datetime
timestamp:时间戳,时间和时区相关,相对于timestamp长度更短
datetime:普通时间,建议使用 - text 和 blob
- enum 和 set 不建议使用
CREATE TABLE `a` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` set('1','2') DEFAULT '',
`delete_flag` enum('1','2') DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
此时name只能有1、2,可多选,大脑delete_flag只能为1或者2
全文索引
针对text类型
InnoDB缓冲池