
mysql高级shk笔记mysql笔记 512-526码云笔记 mysql高级mdmysql-高级 github笔记mysql 部分笔记-半旧MySQL的varchar水真的太深了——InnoDB记录存储结构------------------------------------------------d--------------《MySQL45讲》基础篇总结相关子查询讲解mysql是怎么运行的笔记mysql笔记以及博客都不错MySQL系列专栏-掘金 不错--------ddd—58架构师 数据库文章mysql文章-日志mvcc等MySQL索引的B树到底有多高 转转buffer poolInnoDB 缓冲池LRU策略及关键特性mysql buffer pool 详解掘金文章 【图文详解】MySQL系列之redo log、undo log和binlog详解面试中的老大难-mysql事务和锁一次性讲清楚【图文动画详解原理系列】1.MySQL 索引原理详解为什么MySQL InnoDB 存储引擎要用B树做索引而不用B树行溢出问题数据库 一行最大字节65535 BYTE 个 用了varchar 2 Byte 记录 长字段长度 varchar(65532) 6553565532(可用)2(2个字节的变长字段的长度)1(1个字节null标识) 数据库 一行最大字节65535 BYTE 个所以极限情况下只一个字段 varchar varchar(65533) not null 65535655332(2个字节的变长字段的长度) utf8 一个字符3个字节 utf8mb4 一个字符 4个字节 create table varchardemo{ c carchar(65532) # 65535 -2字节记录变长字段的长度-1NULL标识。 }charsetascii row_formatcompact; create table varchardemo{ c carchar(65533) not null # 65535 -2字节记录变长字段的长度 }charsetascii row_formatcompact;因为一个页是16kb16384Byte而一个varchar(M) 最多可以存储65533个字节。这就出现了一个页面放不开了一条记录这种现象称为行溢出。在compact和reduntant的行格式中对于占用存储空间非常大的列在记录真实数据处只会存储一该列的一部分数据把剩余的数据分散的存储在几个其他的页中进行分页存储。然后记录的真实数据处用20个字节存储指向这些页的地址。一篇文章看懂mysql中varchar能存多少汉字、数字以及varchar(100)和varchar(10)的区别1.存储引擎概念 打比方说一部电影有mp4,wmv,avi,flv...等格式。同样的一部电影在硬盘上有不同的存储格式所占的空间与清晰程度也各不一样。 那么我们表里的数据存储在硬盘上是如何存储的呢 存储的方式也有很多种。 对于用户来说同样一张表的数据无论用什么引擎来存储用户看到的数据都是一样的 但对于服务器来说是有区别的。 数据库对同样的数据有着不同的存储方式和管理方式在mysql中称为存储引擎。redo刷盘策略另外InnoDB存储引擎有一个后台线程每隔1秒 就会把redo log buffer中的内容写到文件系统缓存 (page cache ), 然后调用刷盘操作。数据库并发问题解决方案mysql 主从同步mysql b-tree 扇出mysql 慢查询MySQL慢查询一口从天而降的锅学习理论 3层btree 有多少数据我们再假设扇出系数为k则索引里可索引key的数sk ^ h。在InnoDB里每个页默认16KB假设索引的是8B的long型数据每个key后有个页号4B还有6B的其他数据参考《MySQL技术内幕InnoDB存储引擎》P193的页面数据那么每个页的扇出系数为16KB/(8B4B6B)≈1000即每个页可以索引1000个key。在高度h3时可索引的叶子页面数1000 ^ 2100W因为最下一层为叶子页面。假设每行记录大小为1KB则每个叶子页面可以容纳16f行则总共可索引的行数为100W*161600W也就是说InnoDB通过三次索引页的I/O即可索引1600W的key。同理在高度h4时总行数1000 ^3 *16160亿条数据库优化 步骤为表的字段创建索引。explain 关键字段id 字段在上面的一行是驱动表。type* , possible_keys * ,key, key_len* , ref, filtered, extra。1.1type类型system const eq_ref ref fulltext ref_or_null index_merge unique_subquery index_subquery range index ALLsystem(表中只有一条记录)、const(主键、唯一二级索引 与常量等值查询)、eq_ref连接查询被驱动表通过主键、唯一二级索引等值匹配。、ref(普通二级索引等值匹配)、fulltext、ref_or_null普通二级索引等值匹配查询 索引列可能为null、index_merge(索引合并)、unique_subquery(针对in 子查询子查询可以使用到主键等值匹配)、index_subquery子查询in 二级索引等值匹配、range(索引范围查询 和 key in )、index索引全扫描、all1.2 filtered针对多表连接查询。filtered*row 表示 被驱动表需要执行的次数。1.3 extra·using where在where 条件中除了使用索引字段包含的列还要其他非索引字段。using index使用了覆盖索引。查询的字段 以及搜索条件属于某个索引列。using index condition索引下推分库分表。通过水平分表降低单表数量。垂直分表减少 行中大字段带来的查询影响。读写分离。优化数据库配置4.1 修改数据库最大连接如果实际连接数超过数据库最大连接数会出现“MySQL: ERROR 1040: Too many connections”的异常情况。默认配置下数据库最大连接数是 151我们可以通过如下命令查看show variables like ‘max_connections’ 最大连接数show status like ‘max_used_connections’响应的连接数说明理想值设置为多大才合适了max_used_connections / max_connections * 100% 理想值≈ 85%2我们可以根据情况通过 max_connections 参数修改最大连接数比如下改成 600max_connections600.4.2 设置 innodb_buffer_pool_sizeinnodb_buffer_pool_size必须为 innodb_buffer_pool_instances 的倍数。该设置对 InnoDB 表来说非常重要因为 InnoDB 相比 MyISAM 表对缓冲更为敏感如果使用默认值十分影响性能。一般设置物理内存的 60% - 70%innodb_buffer_pool_size 6G4.3 设置缓冲池实例个数innodb_buffer_pool_instances 84.4 设置日志同步到磁盘方式innodb_flush_log_at_trx_commit0代表大约每秒写入到日志并同步到磁盘数据库故障会丢失 1 秒左右事务数据。1为每执行一条 SQL 后写入到日志并同步到磁盘I/O 开销大执行完 SQL 要等待日志读写这种方式即使系统崩溃也不会丢失任何数据但效率低。2代表只把日志写入到系统缓存区再每秒同步到磁盘效率很高如果服务器故障才会丢失事务数据。页分裂 页合并 mrrMySQL-什么是InnoDB的页分裂和页合并mysql 页分裂机制mrr机制深入理解mysql的索引分类覆盖索引覆盖索引失效回表MRR