InnoDB

MySQL 支持Hash Join咯

大兔子大兔子 提交于 2020-08-20 01:25:17
从8.0.18开始,对等值不能使用索引的Join语句使用Hash Join,之前使用BNL(Block nested loop algorithm);8.0.20移除BNL; 8.0.20 对非等值条件(执行Hash Join再进行过滤(Filter)),笛卡尔积都能使用Hash Join。 CREATE TABLE `t4` ( `c1` int DEFAULT NULL, `c2` int DEFAULT NULL, `c3` int DEFAULT NULL, `c4` int DEFAULT NULL, KEY `c1` (`c1`,`c2`,`c3`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; CREATE TABLE `t5` ( `c1` int DEFAULT NULL, `c2` int DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; delimiter ;; create procedure load_t5() begin declare i int; set i=0; while(i<1000) do insert into t4(c1,c2,c3,c4)

InnoDB基于MVCC和next-key锁解决幻读问题

帅比萌擦擦* 提交于 2020-08-20 01:18:44
InnoDB基于MVCC和next-key锁解决幻读问题 事务的ACID 事务的隔离级别 锁 锁粒度 多版本并发控制(MVCC) SELECT INSERT DELETE UPDATE 可重复读下,MVCC的幻读问题 读操作不会出现幻读 更新操作会出现幻读问题 这种现象的原因 快照读 当前读 如何解决当前读导致的幻读问题 使用可串行化的隔离级别 使用next-key锁,即更新时基于非唯一索引更新数据 事务的ACID 原子性:整个事务中的所有操作要么全部提交成功,要么全部失败回滚; 一致性:总是从一个一致性的状态转换到另外一个一致性的状态,无中间状态; 隔离性:一个事务所做的修改在最终提交以前,对其他事务是不可见的; 持久性:一旦事务提交,其所做的修改就会永久保存到数据库中,即使系统崩溃,数据也不会丢失。 事务的隔离级别 未提交读:事务中的修改,即是没有提交,对其他事务也都是可见的,会出现脏读; 提交读:一个事务开始时,只能看见已经提交的事务所做的修改,也叫不可重复读; 可重复读:保证了再同一个事务中多次读取同样记录的结果是一致的,会出现幻读; 可串行化:会在读取的每一行数据上都加锁,可能导致大量的超时和锁竞争问题。 隔离级别 脏读可能性 不可重复读可能性 幻读可能性 加锁读 未提交读 Yes Yes Yes No 提交读 No Yes Yes No 可重复读 No No Yes

MySQL日志之重做日志redo

元气小坏坏 提交于 2020-08-19 23:20:17
文章目录 1.1 为什么需要redo 1.2 redo log 结构 1.3 刷盘规则 1.4 LSN 1.5 相关变量 1.1 为什么需要redo   数据库为了取得更好的读写性能,会将数据缓存在内存中,对磁盘数据的修改也会落后于内存,这时如果进程或机器崩溃,会导致内存数据丢失,为了保证数据库本身的一致性和持久性,InnoDB引入了redo log。修改数据页之前需要先将修改的内容记录到redo log中,并保证redo log早于对应的数据页落盘,也就是常说的预写式日志(WAL)。当故障发生导致内存数据丢失后,InnoDB会在重启时,通过重放REDO,将Page恢复到崩溃前的状态。 1.2 redo log 结构   redo log是物理日志,记录的是数据页的物理修改,用来恢复提交后的物理数据页。   redo log包括两部分: 内存中的redo log buffer(内存数据,会丢失); 磁盘上的redo log file(磁盘数据,持久化); 日志块   innodb存储引擎中,redo log以块为单位进行存储的,每个块占512字节,称为redo log block。所以不管是log buffer中还是os buffer中以及redo log file中,都是这样以512字节的块存储的,一个页内可以存放非常多的log block。   每个redo log

MySQL独立表空间管理

感情迁移 提交于 2020-08-19 19:19:29
MySQL的Innodb存储引擎包含两种表空间文件模式,默认的共享表空间和每个表分离的独立表空间,每个表都有自已独立的表空间,每个表的数据和索引都会存在自已的表空间中,可以实现单表在不同的数据库中移动。 每个表都有自已独立的表空间,每个表的数据和索引都会存在自已的表空间中,可以实现单表在不同的数据库中移动。 空间可以回收(除drop table操作处,表空不能自已回收),Drop table操作自动回收表空间,如果对于统计分析或是日值表,删除大量数据后可以通过:alter table TableName engine=innodb;回缩不用的空间。 对于使用独立表空间的表,不管怎么删除,表空间的碎片不会太严重的影响性能,而且还有机会处理。 普通建表语句 mysql> create database test; Query OK, 1 row affected (0.00 sec) mysql> use test Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> create table table1(a int); Query

MySQL数据库表设计规范

大兔子大兔子 提交于 2020-08-19 17:41:35
一、数据库设计 1、一般都使用 INNODB 存储引擎,除非读写比率<1%,才考虑使用 MYISAM 存储引擎;其 他存储引擎请在 DBA 的建议下使用。 2、Stored procedure (包括存储过程,函数,触发器)对于 MYSQL 来说还不是很成熟, 没有完善的出错记录处理,不建议使用。 3、UUID(),USER()这样的MySQL INSIDE 函数对于复制来说是很危险的,会导致主备数据不一致,所以请不要使用。如果一定要使用UUID作为主键,让应用程序来产生。 4、请不要使用外键约束,如果数据存在外键关系,请在程序层面实现。 5、必须采用 UTF8 编码。 二、数据库对象设计规范 1、表 设计 a)在设计时尽量包含两个日期字段:crt_time(创建日期),upd_time(修改日期)且 非空, 对表的记录进行更新的时候,必须包含对 upd_time字段的更新。 b)必须要有主键,主键尽量用自增字段类型,推荐类型为INT或者BIGINT类型。 c)需要多表join的字段,数据类型保持绝对一致。 d)Mysql 的表尽量设置成 KV(Key-Value)结构,这样便于扩展和维护。 e)当表的字段数非常多时,可以将表分成两张表,一张作为条件查询表,一张作为详细内容表(主要是为了性能考虑)。 f)当字段的类型为枚举型或布尔型时,建议使用 char(1)类型。 g)同一表中

mysql实战——深入浅出索引

六眼飞鱼酱① 提交于 2020-08-19 17:35:48
一、前言 索引的出现就是为了提高数据查询的效率,就像书的目录一样。 二、索引常见数据结构 可以用于 提高读写效率 的数据结构很多,常见的是哈希表、有序数组、搜索树。 1、哈希表 哈希表时一种key、value存储数据的结构,我们只要输入待查证的值即key,就可以找到其对应的值即value。哈希的思路很简单,把值放在数组里,用一个哈希函数把key换算成确定的值,然后把value放在数组的这个位置。多个key经过hash运算之后,会出现同一个值的情况。处理这种情况的一种方式是拉出链表。所以 哈希表这种结构适用于只有等值查询(比如age=18)的场景 ,比如Memcached及其他一些NoSQL引擎。 2、有序数组 有序数组在等值查询和范围查询的场景中都非常优秀,如果仅仅看查询效率,有序数组就是最好的数据结构 了。但是,在更新数据的时候就更麻烦了,你往中间插入一个记录就必须挪动后面所有的记录,成本太高。所以 有序索引只适用于静态存储引擎 。 比如2017年北京市所有出生人口信息,这类不会在修改的数据。 三、InnoDB的索引模型 在InnoDB中,表都是 根据主键顺序以索引的形式存放的 ,InnoDB使用了B+树索引,所以数据都是存储在B+树中的。 每一个索引对应一个B+树 。 假设我们有1个主键列为ID的表,表中有字段K,并且在K上有索引。 这个表的建表语句是: mysql-

了解MySQL(超详细的MySQL工作原理 体系结构)

邮差的信 提交于 2020-08-19 13:43:09
了解MySQL(超详细的MySQL工作原理 体系结构) 1.MySQL体系结构 2.MySQL内存结构 3.MySQL文件结构 4.innodb体系结构 一、了解MySQL前你需要知道的 引擎是什么: MySQL中的数据用各种不同的技术存储在文件(或者内存)中。这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力。通过选择不同的技术,你能够获得额外的速度或者功能,从而改善你的应用的整体功能。 当我们理解了引擎这个概念,自然而然就知道引擎层的作用就提供各种不同引擎给你选择,然后用你选出来的引擎去处理sql语句 二、MySQL体系结构 MySQL 最重要、最与众不同的特性是它的存储引擎架构,这种架构的设计将查询处理 (Query Processing)及其他系统任务(Server Task)和数据的存储/提取相分离。这种 处理和存储分离的设计可以在使用时根据性能、特性,以及其他需求来选择数据存储 的方式。 由图,可以看出MySQL最上层是连接组件。下面服务器是由 连接池 、 管理工具和服务 、 SQL接口 、 解析器 、 优化器 、 缓存 、 存储引擎 、 文件系统 组成。 用户:进行数据库连接的人。 支持接口:是第三方语言提供和数据库连接的接口,常见的有jdbc,odbc,c的标准api函数等等。 管理工具和服务 :系统管理和控制工具

MySQL的my.cnf文件(解决5.7.18下没有my-default.cnf)

回眸只為那壹抹淺笑 提交于 2020-08-19 13:09:57
官网说:从5.7.18开始不在二进制包中提供my-default.cnf文件。参考: https://dev.mysql.com/doc/refman/5.7/en/binary-installation.html 经过测试,在5.7.18版本中,使用tar.gz安装时,也就是压缩包解压出来安装这种,已经不再需要my.cnf文件也能正常运行。 my.cnf文件就是把在命令行上启动MySQL时后面的参数用cnf文件配置好,那么下载启动时就不再需要在命令上加如参数。 这个my.cnf文件可以是自定义位置,也可以使用如下默认的位置,只要放在默认位置,MySQL自动识别(通过deb或者APT源安装的,初始位置在下方列表): 文件名 目的 /etc/my.cnf 全局选项 /etc/mysql/my.cnf 全局选项 SYSCONFDIR /my.cnf 全局选项 $MYSQL_HOME/my.cnf 服务器特定选项(仅限服务器) defaults-extra-file 指定的文件 --defaults-extra-file ,如果有的话 ~/.my.cnf 用户特定选项 ~/.mylogin.cnf 用户特定的登录路径选项(仅限客户端) 以上的详细说明可以参考官方解释: https://dev.mysql.com/doc/refman/5.7/en/option-files.html 总之

数据库事务、事务隔离级别以及锁机制详解

南楼画角 提交于 2020-08-19 04:30:35
以下主要以MySQL(InnoDB引擎)数据库为讨论背景,纯属个人学习总结,不对的地方还请指出! 什么是事务? 事务是作为一个逻辑单元执行的一系列操作,要么一起成功,要么一起失败。一个逻辑工作单元必须有四个属性,称为 ACID (原子性、致性、隔离性和持久性)属性,只有这样才能成为一个事务。 数据库事物的四大特性( ACID ): 1) 原子性:( Atomicity ) 务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行。 2) 一致性:( Consistency ) 事务在完成时,必须使所有的数据都保持一致状态。在相关数据库中,所有规则都必须应用于事务的修改,保持所有数据的完整性。事务结束时,所有的内部数据结构(如 B 树索引或双向链表)都必须是正确的。 3) 隔离线:( Isolation ) 由并发事务所作的修改必须与任何其它并发事务所作的修改隔离。事务查看数据时数据所处的状态,要么另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据。这为可串行性,因为它能够重新装载起始数据,并且重播一系列事务,以使数据结束时的状态与原始事务执的状态相同。 4) 持久性:( Durability ) 事务完成之后,它对于系统的影响是永久性的。该修改即使出现系统故障也将一直保持。 事务并发时会发生什么问题?(在不考虑事务隔离情况下) 1