Below you will find pages that utilize the taxonomy term “innodb”
September 18, 2018
MySQL中对MVCC的理解总结
"一、MVCC简介 MVCC (Multiversion Concurrency Control),即多版本并发控制技术。InnoDB数据库的事务隔离级别就是通过UNDO和MVCC来实现的(ACID特性),旧数据存储在UNDO中,再通过DB_ROLL_PTR 回溯查找历史版本。\n二、MVCC原理 1、通过DB_ROLL_PT 回溯查找数据历史版本2、通过read view判断行记录是否可见\n理解这一块之前,我们必须先了解一下row的内部存储格式\n字段\u0008说明:\nDB_ROW_ID:长度6个字节。此值由InnoDB自动生成,聚集索引时使用。如果用户未显式指定表主键时,\u001b表优先使用第一个非null的唯一索引作为主键.否则使用DB_ROW_ID的值作为主键ID,聚集索引会使用此值。如果指定了表主键的话,则聚集索引使用指定的值。 DB_TRX_ID:6个字节的事务ID。标记了最后更新此记录的事务ID,每开起一个新事务,其值自动+1 DB_ROLL_PTR:7字节的回滚指针。指向当前记录项的undo log记录,找之前版本的数据需通过此指针。 MySQL中的MVCC原理\n首次 insert 记录 …"
March 29, 2018
MySQL InnoDB锁机制之Gap Lock、Next-Key Lock、Record Lock解析
"InnoDB是一个支持行锁的存储引擎,锁的类型有:共享锁(S)、排他锁(X)、意向共享(IS)、意向排他(IX)。为了提供更好的并发,InnoDB提供了非锁定读:不需要等待访问行上的锁释放,读取行的一个快照。该方法是通过InnoDB的一个特性:MVCC来实现的。\nInnoDB有三种行锁的算法 1,Record Lock:单个行记录上的锁。\n2,Gap Lock:间隙锁,锁定一个范围,但不包括记录本身。GAP锁的目的,是为了防止同一事务的两次当前读,出现幻读的情况。\n3,Next-Key Lock:1+2,锁定一个范围,并且锁定记录本身。对于行的查询,都是采用该方法,主要目的是解决幻读的问题。\n锁的是索引,并不是记录。 记录锁(Record Lock): 单个索引行记录上的锁 间隙锁(Gap Lock):一般是针对非唯一索引而言的. 后码锁(Next-Key Lock):记录锁和间隙锁的结合,对于InnoDB中,更新非唯一索引对应的记录,会加上Next-Key Lock。在RR下如果where未使用索引会使用全表扫描,这个时候会有Next-Key Lock。如果更新记录为空,就不能加记录 …"
March 29, 2018
聚簇索引概念(Myisam与Innodb索引的区别)转推荐
"myisam的主索引和次索引都指向物理行,下面来进行讲解\ninnodb的主键下存储该行的数据,此索引指向对主键的引用\nmyisam的索引存储图如下,可以看出,无论是id还是cat_id,下面都存储有存储物理地址的值。通过主键索引或者次索引来查询数据的时候,都是先查找到\u001b数据地址,然后再到物理位置上去寻找数据。\n[][1]\ninnodb的索引存储图如下,我们会发现,主键索引下面直接存储有数据,而次索引下,存储的是主键的id(不同于MyISAM,存储的是内容数据的物理地址)。通过主键查找数据的时候,就会很快查找到数据,但是通过次索引查找数据的时候,需要先查找到对应的主键id,然后才能查找到对应的数据。\n[][2]\n总结: InnoDB的主索引文件上 直接存放该行数据,称为聚簇索引,次索引指向对主键的引用. Myisam中, 主索引和次索引,都指向物理行(磁盘位置).\n注意:对InnoDB来说, 1: 主键索引 既存储索引值,又在叶子中存储行的数据 2: 如果没有主键, 则会Unique key做主键 3: 如果没有unique,则系统生成一个内部的rowid做主键. 4: 像innodb …"
August 10, 2015
Mysql Innodb的两种表空间方式
"要说表空间,Mysql的表空间管理远远说不上完善。换句话说,事实上Mysql根本没有真正意义上的表空间管理。Mysql的Innodb包含两种表空间文件模式,默认的共享表空间和每个表分离的独立表空间。只要在my.cnf里面增加innodb_file_per_table=1就可以从共享表空间切换到独立表空间。当然对于已经存在的表,则需要执行alter table MY_TABLE engine=innodb命令迁移数据。\n共享表空间方式 由于是默认的方式,就暂且理解为Mysql官方推荐的方式。相对而言所有的数据都在一个(或几个)文件中,比较利于管理,而且在操作的时候只需要open这一个(或几个)文件即可,相对来说代价很低。\n但问题是在数据达到以G为单位来计算的时候优劣逆转。一个大小惊人的文件很不利于管理,而且对于一个如此巨大的文件来说,读写它需要耗费的资源一样巨大。更加令人费解的是,MySQL竟然将索引和数据保存于同一个文件中,索引和数据之间尚存在资源争用,不利于性能的提升。你当然可以通过innodb_data_file_path的配置规划多个表空间文件,但MySQL的逻辑是“用满后增 …"
August 10, 2015
[MySQL优化案例]系列 — 索引、提交频率对InnoDB表写入速度的影响
"本次,我们通过对比,明明白白的知道索引、提交频率对InnoDB表写入速度的影响,了解有哪些需要注意的。\n先直接说几个结论吧:\n1、关于索引对写入速度的影响: a、如果有自增列做主键,相对完全没索引的情况,写入速度约提升 3.11%; b、如果有自增列做主键,并且二级索引,相对完全没索引的情况,写入速度约降低 27.37%; 因此,InnoDB表最好总是有一个自增列做主键。\n2、关于提交频率对写入速度的影响(以表中只有自增列做主键的场景,一次写入数据30万行数据为例):\na、等待全部数据写入完成后,最后再执行commit提交的效率最高; b、每10万行提交一次,相对一次性提交,约慢了1.17%; c、每1万行提交一次,相对一次性提交,约慢了3.01%; d、每1千行提交一次,相对一次性提交,约慢了23.38%; e、每100行提交一次,相对一次性提交,约慢了24.44%; f、每10行提交一次,相对一次性提交,约慢了92.78%; g、每行提交一次,相对一次性提交,约慢了546.78%,也就是慢了5倍; 因此,最好是等待所有事务结束后再批量提交,而不是每执行完一个SQL就提交一次。\n曾经 …"
August 10, 2015
[MySQL FAQ]系列 — 为什么InnoDB表要建议用自增列做主键
"我们先了解下InnoDB引擎表的一些关键特征:\nInnoDB引擎表是基于B+树的索引组织表(IOT);\n每个表都需要有一个聚集索引(clustered index);\n所有的行记录都存储在B+树的叶子节点(leaf pages of the tree);\n基于聚集索引的增、删、改、查的效率相对是最高的;\n如果我们定义了主键(PRIMARY KEY),那么InnoDB会选择其作为聚集索引;\n如果没有显式定义主键,则InnoDB会选择第一个不包含有NULL值的唯一索引作为主键索引;\n如果也没有这样的唯一索引,则InnoDB会选择内置6字节长的ROWID作为隐含的聚集索引(ROWID随着行记录的写入而主键递增,这个ROWID不像ORACLE的ROWID那样可引用,是隐含的)。\n综上总结,如果InnoDB表的数据写入顺序能和B+树索引的叶子节点顺序一致的话,这时候存取效率是最高的,也就是下面这几种情况的存取效率最高:\n使用自增列(INT/BIGINT类型)做主键,这时候写入顺序是自增的,和B+数叶子节点分裂顺序一致;\n该表不指定自增列做主键,同时也没有可以被选为主键的唯一索引(上面的条件),这 …"
July 10, 2013
mysql中innodb表的count优化
"作/译者:叶金荣(imysql#imysql.com\u0026gt;),来源: http://imysql.com,欢迎转载。\n起因:在innodb表上做count(*)统计实在是太慢了,因此想办法看能不能再快点。\n现象:先来看几个测试案例,如下\n一、 sbtest 表上的测试\nshow create table sbtest\\G *************************** 1. row *************************** Table: sbtest Create Table: CREATE TABLE `sbtest` ( `aid` bigint(20) unsigned NOT NULL auto_increment, `id` int(10) unsigned NOT NULL default \u0026#39;0\u0026#39;, `k` int(10) unsigned NOT NULL default \u0026#39;0\u0026#39;, `c` char(120) NOT NULL default \u0026#39;\u0026#39;, `pad` char(60) NOT NULL …"
September 29, 2011
MySQL技术内幕:InnoDB存储-3.6 InnoDB存储引擎文件
"官方教程: http://dev.mysql.com/doc/refman/5.1/zh/storage-engines.html#innodb\n3.6 InnoDB存储引擎文件\n之前介绍的文件都是MySQL数据库本身的文件,和存储引擎无关。除了这些文件外,每个表存储引擎还有其自己独有的文件。这一节将具体介绍和InnoDB存储引擎密切相关的文件,这些文件包括重做日志文件、表空间文件。\n3.6.1 表空间文件\nInnoDB存储引擎在存储设计上模仿了Oracle,将存储的数据按表空间进行存放。默认配置下,会有一个初始化大小为10MB、名为ibdata1的文件。该文件就是默认的表空间文件(tablespace file)。你可以通过参数innodb_data_file_path对其进行设置。格式如下:\ninnodb_data_file_path=datafile_spec1[;datafile_spec2]…\n你也可以用多个文件组成一个表空间,同时制定文件的属性,如:\n[mysqld]\ninnodb_data_file_path = …"