什么是事务?
事务就是满足 ACID 个性的一组操作,能够用 commit 提交一个事务,也能够用 rollback 回滚事务。
AUTOCOMMIT
MySQL 默认 主动提交模式。也就是说,如果不显式应用 START TRANSACTION 语句来开始一个事务,那么每个查问都会被当做一个事务主动提交
存储引擎
MySQL 反对多种存储引擎,甚至你能够本人写一个专属的存储引擎,能够看一下 MySQL 的多存储引擎架构
简介
MySQL 中的数据用各种不同的技术存储在文件或内存中。这些技术中的每一种技术都应用不同的存储机制、索引技巧、锁实现并且最终提供宽泛的不同的性能和能力。通过抉择不同的技术,你可能取得额定的速度或者性能,从而改善你的利用的整体性能。存储引擎其实就是如何存储数据、如何为存储的数据建设索引和如何更新、查问数据等技术的实现办法。
如何抉择引擎?
MySQL 5.5 以前的默认存储引擎是 MyISAM, 5.5 之后换成了 Innodb。
MyISAM
个性 :
- 并发性和锁级别(只有表锁,读锁和写锁互斥)
- 表损坏修复
- 反对全文索引
- 反对表压缩
利用场景 :
- 没有事务
- 只读类利用(读多写少)
- 空间类利用(惟一反对空间类函数的引擎)
- 做很多 count 的计算(MyISAM 会保留表的行数,不须要扫描,Innodb 没有保留,须要扫描)
Innodb
个性
- 反对事务
- 齐全反对事务的 ACID 个性
- Redo log (实现事务的持久性) 和 Undo log (实现事务的原子性,存储未实现事务 log, 用于回滚)
- 反对行锁(通过间隙锁(GAP)在 RR 级别解决了幻读的问题)
- 锁粒度是反对 mvcc(多版本并发管制) 的行级锁
利用场景
- 可靠性要求比拟高,或者要求事务
- 表的更新和查问都很频繁,并且行锁定的机会比拟大
问:如何抉择存储引擎
-
是否须要事务
- Innodb 反对事务,MyISAM 不反对事务
-
可靠性要求
- Innodb 反对齐全的 ACID 个性,反对解体复原,而 MyISAM
-
利用场景
- 频繁读取,不频繁插入和更新的场景倡议应用 MyISAM
- 读写都频繁,要求事务抉择 Innodb
- 存储引擎的个性
别的引擎
MySQL 中的引擎只是一个插件,如果技术好且有须要,甚至本人写一个引擎来应用也是能够的。在这里列举一些别的引擎,个性就不去看了,当前如果有机会用到再写
CSV
Archive
Memory
Merge
MaxDB
MySQL 中的数据类型
1、整数
整数包含了 TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT;
占用内存空间的状况
TINYINT | SMALLINT | MEDIUMINT | INT | BIGINT |
---|---|---|---|---|
1 byte | 2byte | 3 byte | 4 byte | 8 byte |
INT(1)、INT(10) 中的数字只是规定显示字符的个数,然而对于存储和计算是没有影响的。
2、浮点数
浮点数包含 FLOAT 和 DOUBLE, 还有一个 DECIMAL, 是高精度小数类型,能够存比 BIGINT 还大的整数,因为 DECIMAL 是用字符串来保留的。。。。
还有对于单精度和双精度也记录一下
类型 | 符号位 | 指数位 | 小数位 |
---|---|---|---|
单精度 | 1 位 | 8 位 | 23 位 |
双精度 | 1 位 | 11 位 | 52 位 |
3、字符串
字符串包含 char 和 varchar,区别在于 char 是定长的,而 varchar 是变长的,varchar 会依据理论须要的大小来进行存储,然而会额定占用一个字节(长度超过 255 时会占用两个字节)。
VARCHAR 会保留字符串开端的空格,而 CHAR 会删除。
4、工夫和日期
datetime 和 timestamp
datetime 与时区无关,而 timestamp 与时区无关
索引
基于 Innodb 引擎
MySQL 中抉择索引是优化器的工作,如果有多个索引都能够查到数据,优化器会估算应用每个索引的老本而后进行抉择。
如何创立索引?
创立索引有 3 种形式
-
间接创立
create index indexName on tableName(columnName(lenth));
-
在建表的时候创立索引
create table tableName ( id int not null, columnName varchar(16) not null, key indexName (columnName), );
-
批改表构造
alter table tableName add index indexName(columnName);
这里还遇到个小问题,之前始终没有留神过,原来 MySQL 中有 key 和 index 两个关键字,然而他们其实是一样的,在官网有介绍:
KEY is normally a synonym for INDEX. The key attribute PRIMARY KEY can also be specified as just KEY when given in a column definition. This was implemented for compatibility with other database systems.
索引的分类
惟一索引
惟一索引是指索引列没有反复的索引,包含了主键索引和其它索引。
主键索引
主键索引也能够称作聚簇索引,咱们都晓得,Innodb 底层是用 B+ 树实现的,在叶子节点存储的是数据,并且每一条数据必定都有对应的键。如果在建表的时候没有指定主键索引,MySQL 会主动生成一个自增的主键。用一张图来展现一下数据在主键中的存储状况。
其它
泛指定义为惟一索引然而又不是主键索引的索引
创立惟一索引的形式和下面相似,只不过须要多一个 unique 关键字,而且 Innodb 引擎容许惟一索引值为 null。
初始化表
mysql> create table T (
ID int primary key,
k int NOT NULL DEFAULT 0,
s varchar(16) NOT NULL DEFAULT '',
index k(k))
engine=InnoDB;
insert into T values(100,1, 'aa'),(200,2,'bb'),(300,3,'cc'),(500,5,'ee'),(600,6,'ff'),(700,7,'gg');
图片来自极客工夫专栏, 丁奇老师的《MySQL45 讲》真的很赞。
如果在下面的表中执行这条语句 select * from T where k between 3 and 5
执行流程是怎么的呢?
- 用 k 索引树找到 k = 3,失去主键索引 ID = 300
- 将 ID = 300 带回 ID 索引树查到 R3.
- 再从 k 索引树找到 K = 5,对应的 ID = 500
- 回到 ID 索引树查到 ID = 500 的 R4
- 回到 k 索引树找下一个 k = 6,不满足条件,完结查问
- 统计:查 k 索引树三次,ID 索引树 2 次,其中从 k 索引树取到主键的值,再回到主键索引树查问的过程称之为回表。
一般索引
一般索引没有索引列必须惟一的限度。
区别
在查问的时候,惟一索引和一般索引还是有点区别的。如果应用的是一般索引,那么查问语句会在找到第一个不满足条件的时候完结查问,而惟一索引只有找到一个满足条件就会完结查问。不过在查问方面,惟一索引和一般索引的耗费是差不多的,因为在 MySQL 中数据是按页存储的,一次读入一整页,一页能够存上千条 key,然而再更新的时候,两者就有区别了。
笼罩索引
文章结尾创立的索引都是只有一列的,也叫单列索引,而笼罩索引也叫多列索引。借用丁奇老师的例子,对一个城市中的市民建设索引,如果用名字来做索引必定不行,重名的人很多,还须要其余的判断条件来进行筛选。既然如此,能够抉择用身份证号码来做索引,然而这也会有一个问题,如果我要查问的是姓名,然而索引里只有身份证号,这个时候就须要回表去主键索引上查找,多了一次查问。为了解决这个问题,就能够用姓名和身份证号建设联结索引,缩小一个回表的耗费。
CREATE TABLE `tuser` (`id` int(11) NOT NULL,
`id_card` varchar(32) DEFAULT NULL,
`name` varchar(32) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
`ismale` tinyint(1) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `id_card` (`id_card`),
KEY `name_age` (`name`,`age`) // 笼罩索引必须保障索引列没有反复
) ENGINE=InnoDB
最左前缀准则
要晓得,索引在存储的时候是有序的,对于多列索引而言,先保障第一列有序,而后在此基础上第二列有序,以此类推。因而在应用多列索引的时候,会先对第一列索引字段进行匹配,而后再匹配第二列。
公众号:没有幻想的阿巧 后盾回复 “ 群聊 ”,一起学习,一起提高