InnoDB

InnoDB中一棵B+树可以存放多少行数据?

自闭症网瘾萝莉.ら 提交于 2021-01-29 18:11:07
InnoDB一棵B+树可以存放多少行数据? 这个问题的简单回答是: 约2千万 。为什么是这么多呢?因为这是可以算出来的,要搞清楚这个问题,我们先从InnoDB索引数据结构、数据组织方式说起。 我们都知道计算机在存储数据的时候,有最小存储单元,这就好比我们今天进行现金的流通最小单位是一毛。 在计算机中磁盘存储数据最小单元是扇区,一个扇区的大小是512字节,而文件系统(例如XFS/EXT4)他的最小单元是块,一个块的大小是4k,而对于我们的InnoDB存储引擎也有自己的最小储存单元——页(Page),一个页的大小是16K。 下面几张图可以帮你理解最小存储单元: 文件系统中一个文件大小只有1个字节,但不得不占磁盘上4KB的空间。 innodb的所有数据文件(后缀为ibd的文件),他的大小始终都是16384(16k)的整数倍。 磁盘扇区、文件系统、InnoDB存储引擎都有各自的最小存储单元。 在MySQL中我们的InnoDB页的大小默认是16k,当然也可以通过参数设置: mysql> show variables like 'innodb_page_size'; +------------------+-------+ | Variable_name | Value | +------------------+-------+ | innodb_page_size | 16384 | +-

Problems with ORDER BY RAND() and big tables

泄露秘密 提交于 2021-01-29 11:15:04
问题 Hello I asked a question this morning, and I realized that the problem was not where I was looking (here the original question) I have this query to randomly generate registries from an address book. SELECT * FROM address_book ab WHERE ab.source = "PB" AND ab.city_id = :city_id AND pb_campaign_id = :pb_campaign_id AND ab.id NOT IN (SELECT address_book_id FROM calls WHERE calls.address_book_id = ab.id AND calls.status_id IN ("C","NO") OR (calls.status_id IN ("NR","OC") AND TIMESTAMPDIFF(MINUTE

学会熟练使用MySQL索引,快速检索数据库,大大提升工作效率

匆匆过客 提交于 2021-01-29 03:03:32
文章目录 一、MySQL 索引 (一)、索引的概念 (二)、索引的作用 (三)、索引的副作用 (四)、创建索引的原则依据 (五)、索引的分类和创建 (六)、查看索引 (七)、删除索引 (八)、实际案例 一、MySQL 索引 (一)、索引的概念 1、索引是一个排序的列表,在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址 (类似于C语言的链表通过指针指向数据记录的内存地址) 。 2、使用索引后可以不用扫描全表来定位某行的数据,而是先通过索引表找到该行数据对应的物理地址然后访问相应的数据,因此能加快数据库的查询速度。 3、索引就好比是一本书的目录,可以根据目录中的页码快速找到所需的内容。 4、索引是表中一列或者若干列值排序的方法。 5、建立索引的目的是加快对表中记录的查找或排序。 (二)、索引的作用 1、设置了合适的索引之后,数据库利用各种快速定位技术,能够大大加快查询速度,这是创建索引的最主要的原因。 2、当表很大或查询涉及到多个表时,使用索引可以成千,上万倍地提高查询速度。 3、可以降低数据库的I/O成本,并且索引还可以降低数据库的排序成本。 4、通过创建唯一性索引,可以保证数据表中每一行数据的唯一性。 5、可以加快表与表之间的连接。 6、在使用分组和排序时,可大大减少分组和排序的时间。 (三)、索引的副作用 1、索引需要占用额外的磁盘空间。 对于 MyISAM 引擎而言

InnoDB on Spring Boot 2.0.x?

杀马特。学长 韩版系。学妹 提交于 2021-01-29 02:43:16
问题 How to configure the "hibernate.dialect.storage_engine = innodb" property in Spring Boot 2.0.x, please ? Spring Boot 2.0.5.RELEASE MySQL Community Server 8.0.11 application.properties: spring.jpa.hibernate.ddl-auto=create-drop spring.jpa.properties.hibernate.format_sql=true spring.jpa.properties.hibernate.dialect.storage_engine=innodb spring.jpa.show-sql=true MySQL Server Variables: default_storage_engine=InnoDB default_tmp_storage_engine=InnoDB Spring Boot Console output: Hibernate: drop

MySQL 5.6.35 索引优化导致的死锁案例解析

。_饼干妹妹 提交于 2021-01-28 07:27:42
一、背景 随着公司业务的发展,商品库存从商品中心独立出来成为一个独立的系统,承接主站商品库存校验、订单库存扣减、售后库存释放等业务。在上线之前我们对于核心接口进行了压测,压测过程中出现了 MySQL 5.6.35 死锁现象,通过日志发现引发死锁的只是一条简单的sql,死锁是怎么产生的?发扬技术人员刨根问底的优良传统,对于这次死锁原因进行了细致的排查和总结。本文既是此次过程的一个记录。 在深入探究问题之前,我们先了解一下 MySQL 的加锁机制。 二、MySQL 加锁机制 首先要明确的一点是 MySQL 加锁实际上是给索引加锁,而非给数据加锁。我们先看下MySQL 索引的结构。 MySQL 索引分为 主键索引 (或聚簇索引)和 二级索引 (或非主键索引、非聚簇索引、辅助索引,包括各种主键索引外的其他所有索引)。不同存储引擎对于数据的组织方式略有不同。 对InnoDB而言,主键索引和数据是存放在一起的,构成一颗B+树(称为索引组织表),主键位于非叶子节点,数据存放于叶子节点。示意图如下: 而MyISAM是堆组织表,主键索引和数据分开存放,叶子节点保存的只是数据的物理地址,示意图如下: 二级索引的组织方式对于InnoDB和MyISAM是一样的,保存了二级索引和主键索引的对应关系,二级索引列位于非叶子节点,主键值位于叶子节点,示意图如下: 那么在MySQL 的这种索引结构下

索引原理-索引数据结构

℡╲_俬逩灬. 提交于 2021-01-27 10:43:40
推荐一个学习树结构的网站 --> 树结构学习网站 本文目录: 二叉树 红黑树 Hash表 B树 B+树 巨簇索引 非巨簇索引 联合索引 一. 二叉树 插入顺序: 4 2 1 10 6 7 首先, 左侧叶子节点 < 主节点 < 右侧叶子节点 我们乱序插入一些数据, 我们会发现0010这个节点被“孤立”了, 随着数据量的增加树的H(高度)会随之增加, 当我们加到了N的数据量后, 我们再查询这个N. 那么这个树搜索会从根直至到N这个位置, 对于自增的表列而言, 并没有明显提供查询性能. 而且有些节点甚至可能会独立存在, 拉高了树的H. 二. 红黑树 插入顺序: 4 2 1 10 6 7 我们会发现这棵树, 在添加的过程中, 会字段平衡节点与叶子节点之间的关系, 当一侧单向高时, 会把大于和小于的节点提上来, 左面是小于这个节点的, 右面是大于这个节点的, 它相比于二叉树, 有了一个自动平衡的功能, 但是与二叉树有一个相同的特点, 虽然数据量的增加树的高度会无限增加. 所以数据库的索引不会使用这个红黑树, 而JDK8的hashMap是数组+红黑树, 每个bucket内的红黑树节点数量也会有控制. 三. Hash表 Hash表的索引优缺点也显而易见, 对于where条件之后的=查询, 它是可以精确到桶的位置, 然后再看桶内数据哪条数据符合条件, 拿着地址去找数据. 但是缺点也很明显,

Windows中压缩版的MySQL的安装、配置

…衆ロ難τιáo~ 提交于 2021-01-27 03:21:57
本次笔记是根据mysql-8.0.13-winx64版本编写: 1、将下载的压缩包解压到自己想放的目录 2、右键计算机 -> 属性 -> 高级系统设置 -> 环境变量 -> 系统变量 -> path ,将MySQL的bin目录添加进去 3、修改配置文件my.ini,没有自己建一个,修改内容: [mysqld] # 设置3306端口 port=3306 # 设置mysql的安装目录 basedir=D:\\Tools\\mysql-8.0.13-winx64 # 切记此处一定要用双斜杠\\,单斜杠我这里会出错,不过看别人的教程,有的是 单斜杠。自己尝试吧 # 设置mysql数据库的数据的存放目录 datadir=D:\\Tools\\mysql-8.0.13-winx64\\data # 此处同上 # 允许最大连接数 #max_connections=200 # 允许连接失败的次数。这是为了防止有人从该主机试图攻击数据库系统 #max_connect_errors=10 # 服务端使用的字符集默认为UTF8 character-set-server=utf8 # 创建新表时将使用的默认存储引擎 default-storage-engine=INNODB # 默认使用“mysql_native_password”插件认证 #default_authentication_plugin

postgresql也很强大,为何mysql成为主流?

痞子三分冷 提交于 2021-01-26 19:02:55
今天在知乎上看到一个问题的告赞回答,觉得说的挺好的,转发一下。 作者:大宽宽 链接:https://www.zhihu.com/question/31955622/answer/1625152059 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 mysql和postgres的早期完全是两个极端。mysql更像是个“基本上满足关系数据库语法的大号KV”,对关系型数据库的高级功能支持的很不好。我入行时接触的MySQL 5.1和MyISAM存储引擎,不支持ACID,但有如下几点在当时的互联网公司看来是非常合适: 互联网公司为了扩展,长期的经验是,仅仅把数据库当作是一个“存储”,而非存储+核心数据逻辑的计算节点。大量的计算都在业务服务器上进行,而业务服务器可以无限水平扩展,而无需担心有状态的数据迁移问题; 因为没有提供很多高级功能和数据一致性的保障,mysql对于简单的sql支持的反而更加直接,在速度上有很大的优势; 对于OLTP,完全不需要复杂的数据处理功能。简单的select ... from ... where id = xxx; insert into xxx;update xxx set xxx=xxx where id = xxxx是OLTP的主流功能。基于这些功能的ORM的出现大大的提高了生产效率;对于OLAP

Mysql关于事务的几个常见概念

怎甘沉沦 提交于 2021-01-26 10:37:16
目录 一、事务 二、事务4大属性(ACID) 三、事务4种隔离级别 四、mysql事务查看与隔离级别设置 补充:InnoDB支持显示锁定: 一、事务 首先,我们要理解什么是事务? 在计算机中,事务是指访问并可能更新数据库中数据的一个独立工作单元。这个工作单元可能由一条或者多条sql语句组成,事务内的语句要么全部执行成功,要么全部执行失败,以此保证数据库中数据的完整一致性。 举个生活中比较容易理解的例子:例子中的每一条信息假设是一条sql。 1.我先去银行取款机查看卡里有多少钱 2.将身上的500元钱存进去 3.突然想起来没钱吃饭了,又取出来200元 你一定不会希望500块钱存到自助存款机了,但是账上却没多出500;银行也不会愿意取款机吐出了200元钱,账上却没扣掉200元,道理就是这么简单。 所以,如何保证最终结果正确,上面的三个步骤可以理解成一个工作单元:3个步骤必须打包成一个整体,才能保证银行卡里余额最终的正确性,要么都成功,要么都失败。 二、事务4大属性(ACID) A:原子性 C:一致性 I:隔离性 D:持久性 1.原子性atomicity: 一个事务必须被视为一个不可再分割的最小工作单元,不管是有多少个sql语句组成,要么全部成功,要么全部失败,这就是事务的原子性。 2.一致性consistency: 数据库总是从一种一致性的状态转换到另外一个一致性的状态

mysql主从复制原理

旧巷老猫 提交于 2021-01-26 05:28:55
MySQL的主从同步是一个很成熟的架构,优点为:①在从服务器可以执行查询工作(即我们常说的读功能),降低主服务器压力;②在从主服务器进行备份,避免备份期间影响主服务器服务;③当主服务器出现问题时,可以切换到从服务器。 mysql 主(称 master)从(称 slave)复制的原理: 1、 master 将数据改变记录到二进制日志(binary log)中,也即是配置文件 log-bin 指定的文件(这些记录叫做二进制日志事件,binary log events) 2、 slave 将 master 的 binary log events 拷贝到它的中继日志(relay log) 3、 slave 重做中继日志中的事件,将改变反映它自己的数据(数据重演) ---重新执行一下 4、默认 1 分钟同步一次 MySQL的主从同步一直有从库延迟的问题,那么为什么会有这种问题。这种问题如何解决呢? 1. MySQL数据库主从同步延迟原理。 2. MySQL数据库主从同步延迟是怎么产生的。 3. MySQL数据库主从同步延迟解决方案。 1. MySQL数据库主从同步延迟原理。 答:谈到MySQL数据库主从同步延迟原理,得从mysql的数据库主从复制原理说起,mysql的主从复制都是单线程的操作,主库对所有DDL和DML产生binlog,binlog是顺序写,所以效率很高,slave的Slave