
mysql存储
文章平均质量分 91
innodb存储引擎
土拨鼠饲养员
这个作者很懒,什么都没留下…
展开
-
07、 mysql count比较
在开发系统的时候,你可能经常需要计算一个表的行数,比如一个交易系统的所有变更记录总数。这时候你可能会想,一条 select count(*) from t 语句不就解决了吗?但是,你会发现随着系统中记录数越来越多,这条语句执行得也会越来越慢。1.1 count(*) 的实现方式你首先要明确的是,在不同的 MySQL 引擎中,count(*) 有不同的实现方式。MyISAM 引擎把一个表的总行数存在了磁盘上,因此执行 count(*) 的时候会直接返回这个数,效率很高(不使用where过滤的情况下.原创 2021-10-19 22:13:33 · 440 阅读 · 0 评论 -
06、SQL执行时间抖动
1.1 你的 SQL 语句为什么变“慢”了InnoDB 在处理更新语句的时候,只做了写日志这一个磁盘操作。这个日志叫作 redo log(重做日志),在更新内存写完 redo log 后,就返回给客户端,本次更新成功。把内存里的数据写入磁盘的过程,术语就是 flush。在这个 flush 操作执行之前,记录是不一致的。因为孔乙己今天的赊账金额还只在粉板上,而账本里的记录是老的,还没把今天的赊账算进去。当内存数据页跟磁盘数据页内容不一致的时候,我们称这个内存页为“脏页”。内存数据写入到磁盘后,内存和原创 2021-10-14 14:36:36 · 251 阅读 · 0 评论 -
05、 普通索引、唯一索引、字符串索引的选择
假设你在维护一个市民系统,每个人都有一个唯一的身份证号,而且业务代码已经保证了不会写入两个重复的身份证号。如果市民系统需要按照身份证号查姓名,就会执行类似这样的 SQL 语句: select name from CUser where id_card = 'xxxxxxxyyyyyyzzzzz';所以,你一定会考虑在 id_card 字段上建索引。由于身份证号字段比较大,我不建议你把身份证号当做主键,那么现在你有两个选择,要么给 id_card 字段创建唯一索引,要么创建一个普通索引。如果业务.原创 2021-10-13 19:08:59 · 397 阅读 · 0 评论 -
04、 事务到底是隔离的还是不隔离的?
前面提到过,如果是可重复读隔离级别,事务 T 启动的时候会创建一个视图 read-view,之后事务 T 执行期间,即使有其他事务修改了数据,事务 T 看到的仍然跟在启动时看到的一样。也就是说,一个在可重复读隔离级别下执行的事务,好像与世无争,不受外界影响。但是,在行锁的时候又提到,一个事务要更新一行,如果刚好有另外一个事务拥有这一行的行锁,它又不能这么超然了,会被锁住,进入等待状态。问题是,既然进入了等待状态,那么等到这个事务自己获取到行锁要更新数据的时候,它读到的值又是什么呢?我给你举一个例子吧.原创 2021-10-12 16:25:18 · 92 阅读 · 0 评论 -
03、全局锁、表锁、行锁
数据库锁设计的初衷是处理并发问题。作为多用户共享的资源,当出现并发访问的时候,数据库需要合理地控制资源的访问规则。而锁就是用来实现这些访问规则的重要数据结构。根据加锁的范围,MySQL 里面的锁大致可以分成全局锁、表级锁和行锁三类。1.1全局锁全局锁就是对整个数据库实例加锁。MySQL 提供了一个加全局读锁的方法,命令是 Flush tables with read lock (FTWRL)。当你需要让整个库处于只读状态的时候,可以使用这个命令,之后其他线程的以下语句会被阻塞:数据更新语句(数据.原创 2021-10-08 14:14:22 · 141 阅读 · 0 评论 -
02、深入浅出索引
一句话简单来说,索引的出现其实就是为了提高数据查询的效率,就像书的目录一样。一本 500 页的书,如果你想快速找到其中的某一个知识点,在不借助目录的情况下,那我估计你可得找一会儿。同样,对于数据库的表而言,索引其实就是它的“目录”。1.1 索引的常见模型索引的出现是为了提高查询效率,但是实现索引的方式却有很多种,所以这里也就引入了索引模型的概念。可以用于提高读写效率的数据结构很多,这里我先给你介绍三种常见、也比较简单的数据结构,它们分别是哈希表、有序数组和搜索树。下面我主要从使用的角度,为你简原创 2021-10-08 11:32:43 · 96 阅读 · 0 评论 -
01 MYSQL基础篇(select、update执行、事务隔离)
1. SQL查询语句的执行 mysql> select * from T where ID=10;这条SQL的执行流程MySQL 的逻辑架构图从图中不难看出,不同的存储引擎共用一个Server 层,也就是从连接器到执行器的部分。1.1 连接器连接器负责跟客户端建立连接、获取权限、维持和管理连接。连接命令一般是这么写的: mysql -h$ip -P$port -u$user -p连接完成后,如果你没有后续的动作,这个连接就处于空闲状态,你可以在 show process原创 2021-09-30 18:05:57 · 423 阅读 · 0 评论 -
2.5 InnoDB存储引擎启动、关闭与恢复
2.1 InnoDB存储引擎概述InnoDB 存储引擎最早由 Innobase Oy 公司开发,被包括在 MySQL 数据库所有的二进制发行版本中,从 MySQL 5.5 版本开始是默认的表存储引擎(之前的版本 InnoDB存储引擎仅在 Windows 下为默认的存储引擎)。该存储引擎是第一个完整支持 ACID 事务的 MySQL 存储引擎(BDB 是第一个支持事务的 MySQL 存储引擎,现在已经停止开发),其特点是行锁设计、支持 MVCC、支持外键、提供一致性非锁定读,同时被设计用来最有效地利用以原创 2021-08-25 16:11:02 · 298 阅读 · 1 评论 -
6.1 InnoDB存储引擎之锁(什么是锁)
消除关于行级锁的一个"神话"∶人们认为行级锁总会增加开销。实际上,只有当实现本身会增加开销时,行级锁才会增加开销。InnoDB存储引擎不需要锁升级,因为一个锁和多个锁的开销是相同的。6.1 什么是锁锁是数据库系统区别于文件系统的一个关键特性。锁机制用于管理对共享资源的并发访问。InnoDB存储引擎会在行级别上对表数据上锁,这固然不错。不过 InnoDB存储引擎也会在数据库内部其他多个地方使用锁,从而允许对多种不同资源提供并发访问。例如,操作缓冲池中的LRU列表,删除、添加、移动 LRU列表中的元素.原创 2021-09-29 16:46:15 · 163 阅读 · 0 评论 -
5.2 InnoDB存储引擎之索引与算法(B+树索引的使用、哈希算法、全文检索)
5.6 B+树索引的使用5.6.1 不同应用中 B+ 树索引的使用需要根据自己的具体生产环境来使用索引,并观察索引使用的情况,判断是否需要添加索引。不要盲从任何人给你的经验意见,Think Different。在 OLTP应用中,查询操作只从数据库中取得小部分数据,一般可能都在 10条记录以下,甚至在很多时候只取1条记录,如根据主键值来取得用户信息,根据订单号取得订单的详细信息,这都是典型 OLTP应用的查询语句。在这种情况下,B+ 树索引建立后,对该索引的使用应该只是通过该索引取得表中少部分的数据原创 2021-09-29 16:04:15 · 202 阅读 · 0 评论 -
5.1 InnoDB存储引擎之索引与算法(B+树,B+树索引)
5.1 InnoDB存储引擎索引概述InnoDB存储引擎支持以下几种常见的索引∶B+树索引全文索引哈希索引InnoDB存储引擎支持的哈希索引是自适应的,InnoDB存储引擎会根据表的使用情况自动为表生成哈希索引,不能人为干预是否在一张表中生成哈希索引。B+树索引就是传统意义上的索引,这是目前关系型数据库系统中查找最为常用和有效的索引。B+ 树索引的构造类似于二叉树,根据键值(Key Value)快速找到数据。注意 B+ 树中的B不是代表二叉(binary),而是代表平衡(balanc原创 2021-09-28 14:37:40 · 606 阅读 · 0 评论 -
4.2 InnoDB存储引擎之表(Named File Formats、约束、视图、分区)
4.5 Named File Formats 机制长字符类型字段的存储。这些新的页数据结构和之前版本的页并不兼容,因此从 InnoDB 1.0.x版本开始,InnoDB存储引通过 Named File Formats机制来解决不同版本下页结构兼容性的问题。InnoDB存储引擎将1.0.x 版本之前的文件格式(file format)定义为 Antelope,将这个版本支持的文件格式定义为 Barracuda。新的文件格式总是包含于之前的版本的页格式。图 4-8显示了Barracuda 文件格式和 An原创 2021-09-28 13:41:11 · 247 阅读 · 0 评论 -
4.1 InnoDB存储引擎之表(索引组织表、InnoDB逻辑存储、行记录格式、数据页格式)
4.1 索引组织表在InnoDB存储引擎中,表都是根据主键顺序组织存放的,这种存储方式的表称为索引组织表(index organized table)。在 InnoDB存储引擎表中,每张表都有个主键(Primary Key),如果在创建表时没有显式地定义主键,则InnoDB存储引擎会按如下方式选择或创建主键∶首先判断表中是否有非空的唯一索引(Unique NOT NULL),如果有,则该列即为主键。如果不符合上述条件,InnoDB存储引擎自动创建一个6字节大小的指针。当表中有多个非空唯一索原创 2021-09-27 19:23:06 · 412 阅读 · 0 评论 -
3.2 InnoDB存储引擎之文件(参数文件、日志文件等)
3.3 套接字文件UNIX系统本地连接MySQL需要一个套接字(socket)文件。一般在/tmp目录下,名为mysql.lock3.4 pid文件当 MySQL 实例启动时,会将自己的进程ID写入一个文件中——该文件即为 pid文件。该文件可由参数 pid_file 控制,默认位于数据库目录下,文件名为主机名.pid∶3.5 表结构定义文件因为MySQL 插件式存储引擎的体系结构的关系,MySQL 数据的存储是根据表进行的,每个表都会有与之对应的文件。但不论表采用何种存储引擎,MySQ原创 2021-09-27 10:36:34 · 321 阅读 · 0 评论 -
3.1 InnoDB存储引擎之文件(参数文件、日志文件等)
3.1 参数文件告诉 MySQL 实例启动时在哪里可以找到数据库文件,并且指定某些初始化参数,这些参数定义了某种内存结构的大小等设置,还会介绍各种参数的类型。3.1.1 什么是参数数据库参数可以看成K/V键值对,可以通过SHOW VARIABLES查看数据库的所有参数,也可以通过LIKE来过滤,5.1版本开始,还可以通过information_schema架构下的GLOBAL_VARIABLES试图来查找。3.1.2 参数类型MySQL 数据库中的参数可以分为两类∶动态(dynamic原创 2021-08-25 16:41:24 · 179 阅读 · 0 评论 -
2.4 Innodb存储引擎特性(Insert Buffer、Double Write、Adaptive Hash Index等)
2.6 InnoDB 关键特性InnoDB存储引擎的关键特性包括∶插入缓冲(Insert Buffer)两次写(Double Write)自适应哈希索引(Adaptive Hash Index)异步 IO(Async IO)刷新邻接页(Flush Neighbor Page)上述这些特性为 InnoDB 存储引擎带来更好的性能以及更高的可靠性。2.6.1 插入缓冲Insert BufferInsert Buffer 可能是 InnoDB 存储引擎关键特性中最令人激动与兴奋的原创 2021-08-25 09:28:31 · 398 阅读 · 0 评论 -
2.3 Innodb存储引擎之Master Thread工作方式
2.5 Master Thread工作方式2.5.1 InnoDB 1.0.x 版本之前的 Master ThreadMaster Thread具有最高的线程优先级别。其内部由多个循环(loop)组成∶主循环(loop)、后台循环(backgroup loop)、刷新循环(flushloop)、暂停循环(suspend loop)。 Master Thread 会根据数据库运行的状态在 loop、background loop、flush loop 和 suspend loop 中进行切换。Loop原创 2021-08-25 09:27:01 · 146 阅读 · 0 评论 -
2.2 InnoDB存储引擎之Checkpoint 技术
2.4 Checkpoint 技术前面已经讲到了,缓冲池的设计目的为了协调 CPU速度与磁盘速度的鸿沟。因此页的操作首先都是在缓冲池中完成的。如果一条 DML 语句,如 Update 或 Delete 改变了页中的记录,那么此时页是脏的, 即缓冲池中的页的版本要比磁盘的新。数据库需要将新版本的页从缓冲池刷新到磁盘。倘若每次一个页发生变化,就将新页的版本刷新到磁盘,那么这个开销是非常大的。若热点数据集中在某几个页中,那么数据库的性能将变得非常差。同时,如果在从缓冲池将页的新版本刷新到磁盘时发生了宕机,那原创 2021-08-25 09:26:01 · 195 阅读 · 0 评论 -
2.1 InnoDB存储引擎(概述、版本、体系结构)
2.1 InnoDB存储引擎概述InnoDB 存储引擎最早由 Innobase Oy 公司开发,被包括在 MySQL 数据库所有的二进制发行版本中,从 MySQL 5.5 版本开始是默认的表存储引擎(之前的版本 InnoDB存储引擎仅在 Windows 下为默认的存储引擎)。该存储引擎是第一个完整支持 ACID 事务的 MySQL 存储引擎(BDB 是第一个支持事务的 MySQL 存储引擎,现在已经停止开发),其特点是行锁设计、支持 MVCC、支持外键、提供一致性非锁定读,同时被设计用来最有效地利用以原创 2021-08-25 09:24:51 · 901 阅读 · 0 评论 -
1.MySQL 体系结构和存储引擎
1.定义数据库和实例数据库∶ 物理操作系统文件或其他形式文件类型的集合。在 MySOL 数据库中,数据库文件可以是 frm、MYD、MYI、ibd结尾的文件。当使用NDB引擎时,数据库的文件可能不是操作系统上的文件,而是存放于内存之中的文件,但是定义仍然不变。实例∶MySQL 数据库由后台线程以及一个共享内存区组成。共享内存可以被运行的后台线程所共享。需要牢记的是,数据库实例才是真正用于操作数据库文件的。MySQL 被设计为一个单进程多线程架构的数据库,MYSQL实例在操作系统上的表示就是一个进原创 2021-08-24 16:12:42 · 136 阅读 · 0 评论