关于golang:MySQL-基础

2次阅读

共计 3420 个字符,预计需要花费 9 分钟才能阅读完成。

什么是事务?

事务就是满足 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 种形式

  1. 间接创立

    create index indexName on tableName(columnName(lenth));
  2. 在建表的时候创立索引

    create table tableName (
        id int not null,
        columnName varchar(16) not null,
        key indexName (columnName),
    );
  3. 批改表构造

     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 执行流程是怎么的呢?

  1. 用 k 索引树找到 k = 3,失去主键索引 ID = 300
  2. 将 ID = 300 带回 ID 索引树查到 R3.
  3. 再从 k 索引树找到 K = 5,对应的 ID = 500
  4. 回到 ID 索引树查到 ID = 500 的 R4
  5. 回到 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

最左前缀准则

要晓得,索引在存储的时候是有序的,对于多列索引而言,先保障第一列有序,而后在此基础上第二列有序,以此类推。因而在应用多列索引的时候,会先对第一列索引字段进行匹配,而后再匹配第二列。

公众号:没有幻想的阿巧 后盾回复 “ 群聊 ”,一起学习,一起提高

正文完
 0