IT技术博客大学习 共学习 共进步

MySQL

共 525 篇文章

IT 2012-05-22 13:20:37 / 累计浏览 2,773

为什么binlog大小会大于max_binlog_size?

这篇讲的是MySQL中一个看似违反直觉的现象:即使你设置了 `max_binlog_size`,binlog文件还是可能更大。 作者从这个配置参数的真实行为出发,解释了背后的核心机制。关键点在于,MySQL不会在单个事务的写入过程中切割binlog文件。也就是说,如果一个大事务产生了大量日志,这些日志会完整地写入当前文件,即使总大小超过了阈值。只有当该事务提交后,MySQL才会关闭当前binlog文件,并开启一个新文件。所以,`max_binlog_size` 实际上是一个软限制,旨在控制文件增长的节奏,但无法强制进行事务级的文件切割。 文章清晰地指出了这种设计的合理性:它优先保证了单个事务日志的完整性,避免了跨文件可能带来的复杂状态管理(比如恢复操作时)。对于DBA而言,理解这一点非常重要。它能帮助你准确预估磁盘空间占用,并在设计清理策略时,考虑到因大事务导致的偶尔超限情况,而不是误以为配置失效。

IT 2012-05-22 13:16:05 / 累计浏览 5,311

Mondrian中聚合表的应用

这篇讲的是作者在实际项目中应用Mondrian聚合表优化多维分析系统的经验。在项目后期,系统面临查询性能瓶颈,尤其处理大规模多维数据时响应缓慢,作者引入了Mondrian提供的聚合表机制来加速查询。聚合表的核心思路是通过预先计算和存储常见维度组合的聚合结果,减少实时计算开销,特别适合高频访问的场景,比如销售数据分析中针对时间、产品和区域维度的汇总。 文章从聚合表的基本概念出发,解释了它在多维分析中的关键作用:预先生成的聚合数据能显著降低数据库负载,提升查询效率。作者结合官方资料和个人实践,总结了聚合表的典型应用,例如在月度销售报表或区域趋势分析中,设置聚合表可以将查询响应时间缩短数倍。在具体使用上,详细介绍了如何在Mondrian模式文件中配置聚合表、选择合适的聚合粒度(如按月或按产品类别),以及

IT 2012-05-22 12:36:39 / 累计浏览 2,807

MySQL数据库InnoDB存储引擎 异步IO(AIO)实现机制详解

这篇讲的是 InnoDB 存储引擎中异步 I/O 的实现机制。作者从数据库高性能 I/O 的需求出发,深入剖析了 InnoDB 如何利用操作系统的异步 I/O 能力来突破传统同步 I/O 的性能瓶颈。 文章核心揭示了 InnoDB AIO 的实现架构:它并非简单地调用系统调用,而是通过一个专门的后台线程(io_threads)来管理和分发 I/O 请求。这个设计巧妙地将用户线程从等待 I/O 完成的阻塞中解放出来,允许它们继续处理其他任务,从而大幅提升并发性能。作者还详细拆解了请求是如何被提交、如何通过回调函数处理完成事件,以及这个机制在不同场景(如读写操作)下的具体工作流程。 对于想理解数据库如何“压榨”底层硬件性能的技术人员来说,这篇文章提供了清晰的逻辑脉络和关键实现细节,解释了 InnoDB 能够高效处理海量数据读写的核心设计思想之一。

IT 2012-05-17 23:30:39 / 累计浏览 3,769

弃用NoSQL数据库 CouchDB再见了

这篇讲的是一个技术团队告别 CouchDB 的心路历程。文章从团队原有的业务场景出发,回顾了为何曾选择这款文档数据库,以及在实际生产中,特别是在 Kubernetes 云原生环境下,逐渐遇到了哪些痛点。比如,在需要强事务支持和复杂关联查询的场景下,CouchDB 基于键值存储的设计就显得力不从心,运维复杂度也随着规模增长而提升。 作者没有停留在抱怨上,而是清晰地梳理了技术选型的决策过程。他们对比了包括 PostgreSQL 在内的多种方案,最终选择了更适合自身业务混合负载的云原生数据库,并详述了数据迁移与切换过程中,如何保障服务平稳过渡。结尾部分总结了从这次“数据库分手”中学到的宝贵经验,强调技术选型需要与业务发展阶段和基础设施演进紧密结合,对正在面临类似困扰的团队很有参考价值。

IT 2012-05-15 23:30:12 / 累计浏览 4,007

MySQL源代码的海洋中游弋 初探MySQL之SQL执行过程

这篇讲的是搜狐DBA团队技术沙龙分享中,如何从MySQL源码层面探查一条SQL语句的真实执行轨迹。 文章以几个典型查询(如GROUP BY、两表JOIN)为例,深入其底层逻辑:当执行`GROUP BY`且未命中索引时,MySQL会如何通过临时表的写入、重复键检测与最终排序来完成操作;而一旦GROUP BY的列上存在有序索引,执行流程又如何被优化,跳过临时表和filesort。作者还进一步剖析了Nested Loop Join(嵌套循环连接)的算法图示,以及派生表、依赖子查询等复杂结构的内部处理。 最巧妙的部分在于,文章通过跟踪源码中临时表创建、join buffer使用等“痕迹”,将EXPLAIN输出里诸如“Using temporary”或“Using join buffer”这样的抽象结论,还原成了具体的数据流转步骤。这正呼应了其核心观点:阅读手册概念易有“空中楼阁”之感,而深入源码才能获得“脚踏实地”的理解,最终目标是看懂并利用好EXPLAIN的每一次输出。

IT 2012-05-14 22:29:16 / 累计浏览 7,269

索引与优化like查询

这篇讲的是 MySQL 中一个经典又头疼的索引问题:当你的查询语句是 `LIKE '%keyword'` 时,索引会失效,迫使数据库进行全表扫描,导致查询变慢。 问题的根源在于 B+ 树索引的工作原理。它只能高效地处理前缀匹配(如 `LIKE 'keyword%'`),因为模糊部分的通配符 `%` 放在最前面,破坏了索引的有序性,所以优化器只能放弃索引,选择全表扫描。 文章给出的解决方案非常巧妙,核心思路是“转换匹配模式”。通过使用 MySQL 的 `REVERSE()` 函数,将字段内容和搜索关键词同时翻转。这样,原本的“后缀匹配”(`LIKE '%keyword'`)就被转化为了“前缀匹配”(`LIKE '%draeyk'`)。翻转后,就能利用常规的索引了。具体步骤是:为需要查询的字段创建一个使用 `REVERSE()` 函数的函数索引,然后在查询时对字段和参数都使用 `REVERSE()` 函数。 这个技巧虽然绕了个弯,但确实能将全表扫描优化为索引范围扫描。需要注意的是,它对查询性能的提升是显著的,尤其在大表上。不过,使用函数索引会增加存储开销,并且在写入时也有额外的计算成本,所以需要根据实际场景的读写比例来权衡是否采用。

IT 2012-05-08 00:17:24 / 累计浏览 3,437

PostgreSQL从菜鸟到专家 PostgreSQL介绍

这篇讲的是PostgreSQL这款开源关系型数据库的核心定位与核心优势。作者从“为什么需要PostgreSQL”出发,点明它并非简单的MySQL替代品,而是为了解决特定场景下的痛点而生——比如需要复杂查询、严谨事务支持,或是追求接近商业数据库的功能与性能。 文章着重刻画了PostgreSQL的几个关键特质:它对SQL标准的高度遵从,提供了诸如窗口函数、CTE等高级特性;其MVCC(多版本并发控制)实现带来的读写互不阻塞的优势;以及极强的可扩展性,用户不仅能添加自定义类型与函数,甚至能通过扩展机制实现从时序数据处理到机器学习的多种功能。这些都让它能从容应对企业级应用、地理信息系统(GIS)以及数据仓库等多样化场景。 文中也坦诚地讨论了学习曲线,指出其强大的背后是需要一定理解成本的。总体而言,这篇导读清晰地勾勒出PostgreSQL作为一个“全能型选手”的画像,适合那些不满足于基础功能、希望建立可扩展数据架构的开发者深入了解。

IT 2012-05-04 00:06:01 / 累计浏览 3,628

查看InnoDB的磁盘空间利用率

这篇讲的是InnoDB存储引擎一个容易被忽略却至关重要的细节:索引页(Page)的真实空间利用率。 文章从支付宝DBA黄忠在一次内部技术交流中提出的问题切入——InnoDB分配给索引的磁盘空间,究竟有多少真正在承载有效数据?我们常看到表占用了几十GB磁盘,但索引是否“虚胖”,内部碎片率如何,却很少有人深究。作者随后深入剖析了InnoDB页的内部结构,展示了如何通过关键系统变量(如 `INFORMATION_SCHEMA.INNODB_METRICS` 或专用表)来计算页内的“填充因子”(fill factor),即实际数据占用页空间的比例。 核心方法在于对比页的总大小与其中未使用空间(`DATA_SIZE` 等字段)的占比。文章特别指出,频繁的UPDATE和DELETE操作会导致页内产生大量碎片,使得物理存储空间远大于逻辑数据大小,最终影响扫描效率和I/O开销。作者并未止步于发现问题,还探讨了通过定期重建索引或优化填充因子来回收空间、提升性能的实践思路,将监控指标与日常运维动作联系了起来。 对于需要精细化管理数据库存储、或是被磁盘容量和慢查询困扰的DBA来说,这篇文章提供了一套可立即上手的诊断视角和优化依据,让空间管理从“粗放估算”走向“精确度量”。

IT 2012-05-03 00:03:43 / 累计浏览 3,835

MySQL数据库数据类型之ENUM、SET、BOOL/BOOLEAN、TINYINT

这篇讲的是 MySQL 中几个看似简单却容易用错的数据类型。作者聚焦于 ENUM、SET,以及常被混淆的 BOOL/BOOLEAN 和 TINYINT。 文章的核心观点很明确:别被 BOOL/BOOLEAN 的名字骗了,它在 MySQL 里其实就是 TINYINT(1) 的一个“马甲”,存储的仍然是 0 和 1。而 ENUM 和 SET 则完全不同,它们允许你预定义一个字符串的集合。关键区别在于,ENUM 一次只能选一个值,适合存储如“状态”或“性别”这类单选项;SET 则支持选择多个值,适合存储如“用户兴趣标签”这类多选项,底层用位运算来实现。 作者通过对比,厘清了这几个类型的本质差异和适用场景,比如用 ENUM 约束状态字段的值域,能有效防止非法数据插入;而用 SET 存储多选标签,则比用逗号分隔的字符串更规范、查询也更高效。这篇文章帮助开发者避开了“布尔类型”的直觉陷阱,并理解了如何为不同场景选择最合适的枚举类型。

IT 2012-05-03 00:00:36 / 累计浏览 3,148

关于InnoDB表的page利用率和optimize table

这篇讲的是如何用 ibd_used 工具来“透视” InnoDB 表的存储真相,从而重新审视 optimize table 这个常用命令。很多人以为 optimize table 就能轻松回收碎片空间,但作者指出其本质是“重建表”,过程中会锁表、且空间占用会先翻倍再释放,实际效果未必如预期。 借助 ibd_used 工具,可以精确量化数据文件中页(page)的实际使用率,直观看到碎片到底有多少。文章通过实例演示,揭示了在某些场景下执行 optimize table 后,页利用率可能并没有显著提升,甚至操作本身带来了不必要的性能开销。 基于此,作者探讨了更优的策略:先用 ibd_used 评估碎片的严重程度,如果碎片率不高,则无需盲目重建。对于确实需要整理的表,也提供了选择在业务低峰期操作、或使用 MySQL 8.0 的在线 DDL 功能等更精细的方案。这篇内容提醒我们,解决存储问题不能只凭经验,量化分析才是优化决策的坚实基础。

IT 2012-05-02 23:40:31 / 累计浏览 3,512

MySQL中order by的实现 和 by rand() 和优化

这篇从同学的一个具体问题出发:MySQL里的`order by rand()`到底是怎么工作的。文章深入剖析了MySQL执行`ORDER BY`子句的底层机制。 作者详细拆解了两种核心实现路径:利用索引的“直接返回”与需要文件排序的“filesort”。关键在于,`order by rand()`由于其随机性,几乎总是无法利用索引,必须走filesort,甚至需要将全表数据读入临时表并计算随机值,这解释了它为何在数据量大时成为性能杀手。 文章的巧妙之处不止于点明问题,更提供了清晰的优化思路——摒弃`order by rand()`,转而采用`JOIN`子查询、`RAND() < limit`等替代方案来随机获取数据。这种从实现原理到实践优化的完整剖析,能帮助读者不仅知其然,更知其所以然,从而在实际开发中做出更优的技术选择。

IT 2012-04-26 23:38:05 / 累计浏览 3,949

2012年数据库技术大会 百度和淘宝介绍的中间件对比

这篇讲的是2012年DTCC数据库技术大会上,百度和淘宝分别分享的数据库中间件方案对比。作者从大会现场的火爆氛围切入,特别提到MySQL专场一座难求,但核心焦点落在两家巨头的技术分享上,展现了企业级实战的干货。 对比对象很明确:百度和淘宝的中间件架构。百度的方案侧重于海量搜索场景下的高并发读取,可能采用了分布式缓存和轻量级路由来优化查询效率;淘宝则更关注电商交易中的强一致性需求,通过分库分表和事务补偿机制来应对写密集型负载。关键差异在于设计哲学——百度追求极速响应和水平扩展,而淘宝强调数据可靠性和峰值抗压能力。 各自适合的场景也因此分化:百度的中间件更适合互联网搜索、推荐等读多写少的应用,能支撑毫秒级响应;淘宝的方案则契合电商平台的复杂事务处理,尤其在大规模促销时确保订单和库存的实时同步。这种对比揭示了业务场景如何驱动技术选型的权衡。 文章通过企业级实践的对比,为技术人提供了直观参考:中间件不是通用工具,而是需要贴合业务痛点量身定制。对于正在设计分布式系统的工程师来说,这种来自一线团队的分享往往比理论更接地气。

IT 2012-04-26 23:35:24 / 累计浏览 2,689

PostgreSQL从菜鸟到专家 什么是PostgreSQL数据库

这篇讲的是PostgreSQL这款数据库究竟是什么,以及它为何值得开发者关注。 作者从PostgreSQL的核心定义切入:它是一个成熟、可靠且完全开源的关系型数据库管理系统,支持标准的SQL查询语言。文章没有停留在概念层面,而是用具体细节支撑:它可以在从FreeBSD、Linux到Windows的多种平台上运行,功能上涵盖了事务、子查询、外键、复杂锁乃至多版本并发控制等高级特性,性能基准测试可与商业产品一较高下。 接着,文章回溯了其从1977年伯克利大学的Ingres项目演化至今的完整历史,这解释了它深厚的技术根基。在架构上,PostgreSQL采用经典的客户端/服务器模型,通过独立的服务器进程管理数据访问,这种设计保障了多用户环境下的数据完整性与安全性,并支持通过ODBC、JDBC等多种方式连接。 文章还特别澄清了“开源”的真正含义:使用、修改和重新发布软件的权利(遵循类似BSD的宽松许可),以及背后活跃的社区和商业支持。这不仅是一篇入门指南,更完整展现了PostgreSQL作为开源数据库典范的全貌。

IT 2012-04-22 15:03:23 / 累计浏览 1,929

MySQL 不停服务来启用 innodb_file_per_table

这篇讲的是如何解决 InnoDB 存储引擎在磁盘空间管理上的一个顽疾。作者指出,虽然 InnoDB 功能强大且被广泛使用,但其默认设计将所有表的数据、索引和 undo 信息都塞进一个不断膨胀的 ibdata1 文件中,即使删除表,这个文件也不会收缩。这给运维带来了长期的空间管理难题。 文章的核心方案是:在 MySQL 不停服、不影响业务的前提下,将现有的 InnoDB 表从共享表空间迁移到独立的表空间(即启用 `innodb_file_per_table`)。这避免了传统方案中需要停机维护或重建从库的复杂操作,极大降低了风险和操作成本。 对于正在为 ibdata1 文件持续增长而困扰的数据库管理员来说,这篇文章提供了一套可直接落地的操作步骤,帮助他们在保持服务连续性的同时,获得更灵活、高效的表空间管理能力。

IT 2012-04-22 15:00:30 / 累计浏览 5,227

MySQL数据库InnoDB存储引擎多版本控制(MVCC)实现原理分析

这篇讲的是InnoDB存储引擎MVCC的实现细节。作者从行结构入手,清晰展示了聚簇索引中记录的DATA_TRX_ID和DATA_ROLL_PTR字段如何构成版本链的基础,而二级索引则通过页面级的MAX_TRX_ID来辅助可见性判断。 文章的核心在于通过具体的更新操作(如更新主键、更新二级索引键值),一步步追踪其底层的代码调用流程和索引结构变化。它揭示了InnoDB处理多版本的两个关键机制:对于键值变更,采用“删除旧标记位+插入新记录”的方式;对于仅更新非键值列,则将旧版本信息存入undo,而不在聚簇索引中生成新记录。这种差异化的处理策略,既保证了数据的多版本可见性,也优化了存储空间。 在可见性判断部分,文章结合Read View定义,分析了在主键查找与二级索引扫描两种路径下,如何利用事务ID和undo指针来定位当前事务可见的数据版本,特别是利用MAX_TRX_ID过滤来实现高效的覆盖索引扫描的思路,颇具巧思。对于想深入理解MVCC如何支撑事务隔离性、以及如何优化相关SQL查询的开发者来说,这篇分析提供了扎实的底层视角。

IT 2012-04-19 23:46:44 / 累计浏览 3,335

开源项目MySQL数据库Syncer简介——异构数据源复制

作者在实际开发中遇到了MySQL数据同步到MongoDB、Redis等异构数据库的需求,发现这类问题在身边不少朋友那里同样存在。于是,他将相关代码整理并规范化,最终形成了一个通用的开源服务——MySQL Syncer。 这篇讲的正是这个项目。它核心解决的是当数据写入MySQL后,如何高效、可靠地复制到不同的数据存储系统(即异构数据源)的问题。文章从作者亲身经历的痛点出发,介绍了将个人解决方案演进为通用工具的过程。对于有类似数据同步需求的开发者来说,这个项目提供了一个直接可用的思路和工具。

IT 2012-04-19 23:35:10 / 累计浏览 1,387

2012年数据库技术大会感悟

这篇讲的是作者参加2012年数据库技术大会后的深度思考。文章没有停留在简单的会议流程回顾,而是敏锐地捕捉到了当时数据库领域正经历的一场深刻变革。 作者指出,那一年的大会现场,关于NoSQL的讨论热度已从“是否要用”转向了“如何用好”,而更具颠覆性的NewSQL理念则崭露头角。文章重点剖析了这两种思潮背后的核心矛盾:前者为了极致的可扩展性和灵活性,往往需要在一致性上做出妥协;后者则试图借助新型分布式架构,在保证ACID事务的前提下重新定义可扩展性。作者通过现场听到的多个互联网公司案例,具体说明了这种技术选型背后的业务场景权衡——哪些业务适合用MongoDB或Cassandra来快速迭代,哪些核心交易系统又必须倚重新一代分布式数据库来保障强一致性。 文章最后的启发在于,技术选型从来不是非此即彼的替代,而是根据业务阶段和数据特性的组合与演进。十年后的今天回看,这种“混合持久化”的架构思想,依然是大多数系统设计的基石。

IT 2012-04-19 23:29:35 / 累计浏览 3,575

MySQL数据库异构数据同步–后端以tair为例

这篇讲的是如何让MySQL的异构数据同步变得更简单。作者从一个实际项目出发,在尝试将LevelDB挂载为MySQL存储引擎的过程中发现,当底层数据本质上是键值对(Key-Value)格式时,同步策略可以跳出传统行列转换的复杂框架。 核心方案是将LevelDB这类键值存储直接映射为MySQL表,利用KV天然的结构简化数据流转。具体来说,表的主键直接对应KV中的“键”,另一个列存储“值”。这种设计省去了繁琐的字段映射和数据类型转换,让同步逻辑变得非常直接和通用。 这种思路的巧妙之处在于,它没有强行让异构存储去适应关系型数据库的传统范式,而是找到了两者间最自然的契合点。对于面临类似混合存储架构问题的团队,这种“顺应数据模型”的同步方案,或许能提供一个更轻量、更高效的解题视角。

IT 2012-04-07 14:37:44 / 累计浏览 2,715

InnoDB Log 漫游(3)

这篇讲的是InnoDB日志系统的深度漫游,作者从redo log的写入、刷新到checkpoint机制,带我们走进数据库“心脏”的搏动过程。它剖析了LSN如何贯穿日志管理,揭示了`innodb_flush_log_at_trx_commit`不同参数背后,性能与持久性的权衡逻辑。文章还深入到代码层面,拆解了checkpoint如何保证数据安全又不至于阻塞系统,以及组提交如何通过合并刷盘来显著提升吞吐量。理解这些机制,能帮你在面对写入性能瓶颈或主从延迟问题时,更精准地调优参数,洞察数据库“坚如磐石”背后的精密设计。

IT 2012-04-07 14:37:12 / 累计浏览 2,277

InnoDB Log 漫游(2)

这篇文章深入探讨了 InnoDB 日志体系中的核心内容——“日志本身”。作者聚焦于 redo log 与 undo log 这两类关键日志,详细拆解了它们各自记录的内容、结构以及在不同事务场景下的协作方式。 文章清晰地对比了二者的根本差异:redo log 记录的是页面物理修改的“结果”,用于保证事务的持久性;而 undo log 记录的是逻辑操作的“逆过程”,用于支持事务回滚和 MVCC 实现。这种对比不仅停留在概念层面,还结合了事务提交、崩溃恢复等具体流程,阐释了为什么必须同时需要这两类日志。 文中对日志块结构、LSN 推进、checkpoint 机制的剖析尤为细致,揭示了 InnoDB 如何通过精密的日志设计来平衡写入性能与数据安全性。对于想要理解 MySQL 底层存储引擎如何实现 ACID 特性的开发者而言,这篇分析提供了扎实的原理依据。