CREATE TABLE语句没有指定ENGINE选项,默认创建的就是 InnoDB 表。
?使用SHOW VARIABLES LIKE 'default_storage_engine';命令可以查看默认的存储引擎。
在进一步讨论 InnoDB 体系结构之前,我们先介绍几个 InnoDB 存储引擎的关键特性:
记住这张图可以帮助我们理解 InnoDB 的体系结构,接下来我们分别讨论 InnoDB 的内存结构和磁盘结构。
?在专用的 MySQL 服务器上,通常会给缓冲池分配多达 80% 的物理内存。以下命令显示了 InnoDB 缓冲池相关的配置:
mysql> SHOW VARIABLES LIKE 'innodb_buffer_pool%';
+-------------------------------------+----------------+
| Variable_name | Value |
+-------------------------------------+----------------+
| innodb_buffer_pool_chunk_size | 8388608 |
| innodb_buffer_pool_dump_at_shutdown | ON |
| innodb_buffer_pool_dump_now | OFF |
| innodb_buffer_pool_dump_pct | 25 |
| innodb_buffer_pool_filename | ib_buffer_pool |
| innodb_buffer_pool_in_core_file | ON |
| innodb_buffer_pool_instances | 1 |
| innodb_buffer_pool_load_abort | OFF |
| innodb_buffer_pool_load_at_startup | ON |
| innodb_buffer_pool_load_now | OFF |
| innodb_buffer_pool_size | 8388608 |
+-------------------------------------+----------------+
11 rows in set (0.00 sec)
其中,innodb_buffer_pool_chunk_size 表示每个缓冲块的大小;innodb_buffer_pool_instances 表示缓冲池的实例个数,每个实例由数量相同的缓冲块组成;innodb_buffer_pool_size 表示总的缓冲池大小,是 innodb_buffer_pool_chunk_size * innodb_buffer_pool_instances 的倍数。
缓冲池管理算法
为了提高大量读取操作时的效率,缓冲池被划分为页(page),每个页可能包含多行数据。为了提高缓存管理的效率,缓冲池被实现为页组成的链接列表。最终缓冲池使用特定的 LRU(最近最少使用)算法进行管理,从而将频繁访问的数据保留在缓存中,将最少使用的缓存页移除。
下图演示了缓冲池管理的 LRU 算法。
InnoDB 使用 LRU 算法略有改动,缓存池被分为两个部分:头部的 5/8 是最近被访问过的一个新的子列表,尾部的 3/8 是最近较少访问的一个旧的子列表。这个比例由系统变量 innodb_old_blocks_pct 控制:
mysql> show variables like 'innodb_old_blocks_pct';
+-----------------------+-------+
| Variable_name | Value |
+-----------------------+-------+
| innodb_old_blocks_pct | 37 |
+-----------------------+-------+
1 row in set (0.00 sec)
当一个新的页需要被缓存时,最近最少使用的页将被剔除,新页将被放入缓存池的新旧子列表的中间;这种方式被称为中间点插入策略(midpoint insertion strategy)。用户提交的操作(例如 SQL 查询)或者 InnoDB 的预读(read-ahead)操作都会导致新页的缓存。
一方面,访问旧子列表中的页将会使得它被移动到新子列表的头部,变得更新。如果是用户操作引起的访问,该页将会立即被移动到新的子列表中;如果是预读操作引起的访问,不会立即导致移动,也可能根本不会移动。
另一方面,没有被访问的缓存页将会逐渐被移动到列表的尾部,变得更旧。新子列表和旧子列表中的页都会随着其他页的前移变得更旧;旧子列表中的页还会随着新页的加入变得更旧,最终到达列表的最尾部并且被剔除。
我们可以输入SHOW ENGINE INNODB STATUS命令,利用 InnoDB 标准监控输出查看缓冲池的使用指标,相关信息显示在 BUFFER POOL AND MEMORY 部分:
----------------------
BUFFER POOL AND MEMORY
----------------------
Total large memory allocated 8585216
Dictionary memory allocated 380485
Buffer pool size 512
Free buffers 249
Database pages 259
Old database pages 0
Modified db pages 0
Pending reads 0
Pending writes: LRU 0, flush list 0, single page 0
Pages made young 0, not young 0
0.00 youngs/s, 0.00 non-youngs/s
Pages read 997, created 142, written 156
0.00 reads/s, 0.00 creates/s, 0.00 writes/s
No buffer pool page gets since the last printout
Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s
LRU len: 259, unzip_LRU len: 0
I/O sum[0]:cur[0], unzip sum[0]:cur[0]
其中的 Buffer pool size 是缓冲池分配的数据页数量(512),乘以 innodb_page_size(16384)等于缓冲池的大小(8388608)。
?关于 Buffer Pool 的配置和优化我们将会在 MySQL 实例优化的部分进行介绍。
INSERT、UPDATE或者DELETE操作导致的变更将会在此缓冲,随后再合并(由其他读取操作引起)到缓冲池中。下图演示了变更缓冲的作用过程。
与聚集索引(clustered index)不同,二级索引通常是非唯一索引,索引的插入、更新、删除通常是顺序随机的操作。将变更进行缓存,并且在随后读入缓冲池时进行合并,能够避免将辅助索引页从磁盘读入缓冲池所需的大量随机 I/O。
当系统处于空闲状态或在缓慢关闭期间运行清除操作,定期将更新后的索引页写入磁盘。相对于每次将数据即写入磁盘,这种清除操作可以更有效地写入多个连续的索引值。
在内存中,变更缓冲属于缓冲池的一部分。在磁盘上,变更缓冲属于系统表空间的一部分;当数据库服务器关闭时,索引变更将会被缓冲到磁盘中。
系统变量 innodb_change_buffering 决定了何种类型的操作会被缓冲,默认为 ALL。
如果索引中包含降序索引列或主键中包含降序索引列,就不会对二级索引进行变更缓冲。
我们同样可以输入SHOW ENGINE INNODB STATUS命令,利用 InnoDB 标准监控输出查看变更缓冲的状态信息:
-------------------------------------
INSERT BUFFER AND ADAPTIVE HASH INDEX
-------------------------------------
Ibuf: size 1, free list len 0, seg size 2, 0 merges
merged operations:
insert 0, delete mark 0, delete 0
discarded operations:
insert 0, delete mark 0, delete 0
Hash table size 2267, node heap has 0 buffer(s)
Hash table size 2267, node heap has 0 buffer(s)
Hash table size 2267, node heap has 0 buffer(s)
Hash table size 2267, node heap has 0 buffer(s)
Hash table size 2267, node heap has 0 buffer(s)
Hash table size 2267, node heap has 0 buffer(s)
Hash table size 2267, node heap has 1 buffer(s)
Hash table size 2267, node heap has 3 buffer(s)
0.00 hash searches/s, 0.00 non-hash searches/s
因为变更缓冲最开始只支持插入操作,所以显示为 INSERT BUFFER AND ADAPTIVE HASH INDEX。
?关于 Change Buffer 的配置和优化我们将会在 MySQL 实例优化的部分进行介绍。
?关于 Log Buffer 的配置和优化我们将会在 MySQL 实例优化的部分进行介绍。
SHOW ENGINE INNODB STATUS命令查看自适应哈希索引的使用情况,相关的数据也显示在 INSERT BUFFER AND ADAPTIVE HASH INDEX 部分。
一个 InndoDB 表通常对应一个数据段,而区间是磁盘分配的基本单位,页(默认为 16 KB)是 InndoDB 管理磁盘的最小单位,与操作系统的页(通常是 4 KB)概念不同。
InnoDB 提供的表空间包括:系统表空间(System Tablespace)、独立表空间(File-Per-Table Tablespaces)、通用表空间(General Tablespaces)、回滚表空间(Undo Tablespaces)以及临时表空间(Temporary Tablespaces)。
系统表空间
系统表空间用于存储双写缓冲和变更缓冲。如果创建表和索引时不使用独立表空间或通用表空间,它们也会被存储到系统表空间;不推荐这种做法。在 MySQL 8.0 之前,系统表空间中还包含了 InnoDB 数据字典信息;从 MySQL 8.0 开始, InnoDB 使用统一的 MySQL 数据字典存储元数据。
系统表空间可以拥有一个或多个数据文件。默认情况下在数据目录中创建一个名为 ibdata1 的系统表空间数据文件。系统表空间数据文件的大小和数量由系统参数 innodb_data_file_path 进行控制。
独立表空间
独立表空间(File-Per-Table Tablespaces)用于存储单个 InnoDB 表的数据和索引,每个表空间在文件系统中对应单个数据文件。举例来说,如果我们为 test 数据库创建一个表 t1,MySQL 会在数据目录下的 test 子目录中创建一个数据文件 t1.idb。
InnoDB 默认使用独立表空间创建表,可以使用系统变量 innodb_file_per_table 进行控制。如果禁用该参数,InnoDB 将会默认在系统表空间中创建表。
通用表空间
通用表空间是一种共享的 InnoDB 表空间,可以供多个表和索引使用。通用表空间比独立表空间具有更高的内存利用率。MySQL 服务器将会缓存表空间的元数据,包含多个表的通用表空间需要的内存比多个独立表空间更少。
通用表空间可以像独立表空间一样在 MySQL 数据目录内部或者外部创建数据文件,从而为关键的表指定单独的存储,例如 RAID 或者 DRBD,提高数据访问的性能。
通用表空间使用 CREATE TABLESPACE 语句创建。
回滚表空间
回滚表空间用于存储回滚日志,回滚日志记录中包含了撤销事务对聚集索引记录所作的最新修改所需的信息。回滚记录存储在回滚日志段中,回滚日志段存储在回滚段中。系统变量 innodb_rollback_segments 决定了每个回滚表空间分配的回滚段数量。
MySQL 实例初始化时会创建两个回滚表空间。 默认的回滚表空间在 innodb_undo_directory 参数指定的目录中创建,如果没有定义该参数,则在数据目录中创建。默认回滚表空间的数据文件名为 undo_001 和 undo_002,对应数据字典中的回滚表空间名为 innodb_undo_001 和 innodb_undo_002。
从 MySQL 8.0.14 开始,可以使用 CREATE UNDO TABLESPACE 增加额外的回滚表空间;一个 MySQL 实例最多可以存在 127 个回滚表空间,包括默认的两个回滚表空间。
临时表空间
InnoDB 存在两种临时表空间:会话临时表空间(session temporary tablespaces)和一个全局临时表空间(global temporary tablespace)。
会话临时表空间用于存储用户创建的临时表;当 InnoDB 被设置为磁盘内部临时表的存储引擎时,会话临时表空间也用于优化器创建的内部临时表。从 MySQL 8.0.16 开始,磁盘内部临时表的存储引擎永远都是 InnoDB;在此之前由参数 internal_tmp_disk_storage_engine 决定 。
系统变量 innodb_temp_tablespaces_dir 决定了会话临时表空间的文件目录,默认为数据目录下的 #innodb_temp 子目录。 表 INFORMATION_SCHEMA.INNODB_SESSION_TEMP_TABLESPACES 存储了会话临时表空间的元数据,表 INFORMATION_SCHEMA.INNODB_TEMP_TABLE_INFO 存储了当前活动的用户临时表的元数据。
全局临时表空间(ibtmp1)存储了用户临时表修改信息的回滚段数据。系统变量 innodb_temp_data_file_path 定义了全局临时表空间数据文件的相对路径、名称、大小以及属性。如果没有指定该参数,默认在 innodb_data_home_dir 目录中创建一个名为 ibtmp1 的自动扩展的数据文件,初始大小略微大于 12 MB。
CREATE TABLE语句创建。
CREATE TABLE t1 (a INT, b CHAR (20), PRIMARY KEY (a)) ENGINE=InnoDB;
其中,ENGINE 用于指定表的存储类型;如果不指定,MySQL 默认使用 InnoDB 存储引擎。使用以下命令查看表的信息:
mysql> SHOW TABLE STATUS LIKE 't%' \G
*************************** 1. row ***************************
Name: t1
Engine: InnoDB
Version: 10
Row_format: Dynamic
Rows: 0
Avg_row_length: 0
Data_length: 16384
Max_data_length: 0
Index_length: 0
Data_free: 0
Auto_increment: NULL
Create_time: 2020-02-17 14:32:40
Update_time: NULL
Check_time: NULL
Collation: utf8mb4_0900_ai_ci
Checksum: NULL
Create_options:
Comment:
1 row in set (0.00 sec)
InnoDB 表按照索引的组织方式存储数据,被称为聚簇索引(clustered index)。具体来说,
?关于索引和优化我们将会在 MySQL 模式优化的部分进行介绍。
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re
我想为我的Rails网络应用程序提供推荐功能。特别是,我想向新注册的用户推荐他可能想要关注的其他用户。Rails中是否有用于此目的的引擎/gem?如果没有,我应该从哪里开始构建它?谢谢。 最佳答案 有Coletivogemhttps://github.com/diogenes/coletivo我试了一下。在MySQL上运行。Neo4jhttp://neo4j.org真的很容易实现一个“跟随谁”。事实上,大多数展示其能力的样本都涉及“跟随谁”。快速提示-只有在JRuby上运行时,Neo4j.rb才会很酷。如果不是-使用Neograph
无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD
我正在编写一个简单的静态Rack应用程序。查看下面的config.ru代码:useRack::Static,:urls=>["/elements","/img","/pages","/users","/css","/js"],:root=>"archive"map'/'dorunProc.new{|env|[200,{'Content-Type'=>'text/html','Cache-Control'=>'public,max-age=6400'},File.open('archive/splash.html',File::RDONLY)]}endmap'/pages/search.
导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵
一、引擎主循环UE版本:4.27一、引擎主循环的位置:Launch.cpp:GuardedMain函数二、、GuardedMain函数执行逻辑:1、EnginePreInit:加载大多数模块int32ErrorLevel=EnginePreInit(CmdLine);PreInit模块加载顺序:模块加载过程:(1)注册模块中定义的UObject,同时为每个类构造一个类默认对象(CDO,记录类的默认状态,作为模板用于子类实例创建)(2)调用模块的StartUpModule方法2、FEngineLoop::Init()1、检查Engine的配置文件找出使用了哪一个GameEngine类(UGame
文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co
我去了这个website查看Rails5.0.0和Rails5.1.1之间的区别为什么5.1.1不再包含:config/initializers/session_store.rb?谢谢 最佳答案 这是删除它的提交:Setupdefaultsessionstoreinternally,nolongerthroughanapplicationinitializer总而言之,新应用没有该初始化器,session存储默认设置为cookie存储。即与在该初始值设定项的生成版本中指定的值相同。 关于
我看到其他人也遇到过类似的问题,但没有一个解决方案对我有用。0.3.14gem与其他gem文件一起存在。我已经完全按照此处指示完成了所有操作:https://github.com/brianmario/mysql2.我仍然得到以下信息。我不知道为什么安装程序指示它找不到include目录,因为我已经检查过它存在。thread.h文件存在,但不在ruby目录中。相反,它在这里:C:\RailsInstaller\DevKit\lib\perl5\5.8\msys\CORE\我正在运行Windows7并尝试在Aptana3中构建我的Rails项目。我的Ruby是1.9.3。$gemin