IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

数据库

共 1099 篇文章

IT 2012-07-04 14:07:11 / 累计浏览 3,547

MySQL Cluster集群探索与实践

这篇讲的是作者对MySQL Cluster集群从部署到性能验证的全流程实践。从传统MySQL单主架构在业务增长后遇到的扩展性瓶颈出发,作者选择了MySQL Cluster(NDB Cluster)这一支持多主分布式、具备高可用和实时同步特性的方案作为探索方向。文章详细记录了在云环境上搭建集群的过程,包括数据节点、SQL节点和管理节点的配置要点,并分享了在NDB存储引擎特性调优中遇到的坑,例如对内存配置的严格要求以及与传统InnoDB引擎在事务处理上的差异。通过实际的压测数据,作者对比了集群在不同负载下的表现,展示了其在线扩展节点的能力,同时也坦诚指出了方案在复杂查询支持和开发门槛方面的局限性。最终,文章结合实践得出了MySQL Cluster更适合高并发、强实时、以键值操作为主的场景(如会话管理、实时计数)的结论,为技术选型提供了扎实的参考。

本机暂存
IT 2012-06-20 22:44:41 / 累计浏览 2,101

MySQL表名映射方案及扩展应用

这篇讲的是如何用一个简单方案,优雅地解决MySQL主从架构下需求不一致带来的麻烦。问题很典型:主库为了扛住高并发,做了分库分表;但从库要支持各种复杂的多维查询,不分表又更方便。让同一套代码维护两套完全不同的表结构,显然不现实。 作者给出的核心思路是“表名映射”。简单说,就是在代码层面维护一个映射规则,让访问分库分表的主库时,自动转换到正确的物理表名(比如 `order_2023`),而访问从库时,则统一使用一个聚合的逻辑表名(比如 `order_all`)。这样,业务查询代码可以保持统一,不用关心底层存储差异。 方案的巧妙之处在于它的轻量和可扩展性。它不依赖复杂的中间件,实现成本低,并且这个映射思想可以推广到其他场景,比如多活架构中的库表路由、或者灰度发布时的数据隔离。核心是解耦了业务逻辑与底层数据分布,让架构更灵活。

本机暂存
IT 2012-06-20 00:05:06 / 累计浏览 3,104

MySQL数据库InnoDB存储引擎 Buffer Pool Flush List详解

这篇详解的是MySQL InnoDB存储引擎中Buffer Pool的Flush List机制。作者深入剖析了当数据页在Buffer Pool中被修改成脏页后,InnoDB如何通过Flush List来跟踪并最终将它们异步刷回磁盘的过程。 文章的核心在于阐明Flush List的设计与工作原理。它不是一个简单的队列,而是按照页的修改时间(最早修改时间)进行组织的链表。这个设计巧妙之处在于,它能确保最“老”的脏页被优先刷新,从而有效控制数据库恢复时间(Redo Log覆盖循环的约束),并配合Adaptive Flushing等策略,平衡刷盘对性能的影响。 通过讲解Flush List与LRU List的协同工作、刷盘时机的判断逻辑,以及它对数据库整体性能和稳定性的关键作用,文章为读者理清了InnoDB如何高效、可靠地管理内存与磁盘的数据同步。理解这部分机制,是进行MySQL深度性能优化和故障分析的重要基础。

本机暂存
IT 2012-06-20 00:03:19 / 累计浏览 5,094

MySQL数据库InnoDB存储引擎 Buffer pool LRU List Flush策略详解

这篇文章深入到了MySQL InnoDB存储引擎的内存管理核心,讲的是它如何通过精心设计的LRU List和Flush List协作,来高效管理Buffer Pool这一宝贵的内存资源。作者没有停留在表面概念,而是从LRU链表的“冷热数据分离”机制讲起,剖析了young区和old区如何协作来避免全表扫描等操作对热点数据的污染。 文章的巧妙之处在于揭示了LRU与Flush两个链表的分工与协同。LRU链表负责维护数据的访问热度,决定数据页的“生杀大权”;而Flush链表则专门追踪那些被修改过但还未写入磁盘的脏页,是内存与磁盘同步的关键。通过解析这种双重链表结构与后台刷新线程的配合,文章清晰地展示了一套动态的内存管理策略:既能保证热数据的快速访问,又能异步、平滑地将脏数据刷盘,从而在性能与数据持久性之间找到最佳平衡点。 读完这篇文章,你不仅能理解Buffer Pool配置参数背后的原理,更能对InnoDB如何在高并发压力下既保持响应速度又确保数据不丢失,建立起一个扎实的认知框架。

本机暂存
IT 2012-06-17 17:47:14 / 累计浏览 1,933

数据库数字参考表的妙用

这篇文章讲的是数据库中一个简单却容易被忽略的优化技巧:建立并使用“数字参考表”。作者开篇直接定义了这种表的核心——一个存放连续递增整数序列的表,并附上了具体的建表SQL示例。 数字参考表在实际应用中能发挥多种妙用。例如,当需要生成连续的数字序列(如日期、订单号片段)时,可以用它与其它表进行JOIN来快速构建数据集,避免复杂的循环或临时表操作。它也是实现“行转列”或进行数据补全(如填充缺失的月份记录)的常用辅助工具,在报表统计场景中尤为实用。 作者通过这篇短文,分享了一个构建高效查询和数据预处理的基础组件。这种利用静态序列表来简化逻辑的思路,展示了数据库开发中“以空间换时间”或“化繁为简”的典型实践。

本机暂存
IT 2012-06-14 13:51:50 / 累计浏览 1,636

Oracle 11g 的 VKTM 进程 - virtual keeper of time

这篇讲的是Oracle 11g中一个新引入的后台进程——VKTM,它的全称是“virtual keeper of time”。文章从这个进程的命名入手,揭示了其核心职责:在数据库内部充当高精度的时间管理角色。 作者解释说,VKTM主要负责两项关键任务。一是为数据库提供时间信号,比如在需要基于时间的统计信息时,它能生成精确的中断。二是承担了与集群环境(RAC)紧密相关的“心跳”功能,确保不同节点间的时间同步与协调。正是这个进程的存在,才使得Oracle 11g能够提供诸如“时间模型统计”这类更精细的性能诊断数据。 文章没有停留在概念解释,还点出了VKTM进程的一个实用观察点:可以通过监视它的活动,来间接判断数据库系统的时间精度和负载情况。对于需要深入理解Oracle底层时间管理机制、或者进行数据库性能调优的读者来说,理解VKTM的运作原理,就握住了解开相关谜题的一把钥匙。

本机暂存
IT 2012-06-14 13:49:50 / 累计浏览 2,320

MySQL 中group by的实现

这篇讲的是 MySQL 中 `GROUP BY` 到底是如何实现的。作者从一个常见的误解出发——很多人根据执行计划中的 `Using filesort` 认为,`GROUP BY` 是“先排序,后分组”。但真的是这样吗? 作者通过一个对比实验来验证:在查询中显式添加 `ORDER BY NULL` 后,`filesort` 消失了,结果行的出现顺序也发生了改变。这说明排序并非分组的必要步骤,而是后续的一个可选操作。 文章深入到了算法层面。MySQL 实际采用的是一种更高效的哈希分组算法:它会创建一个临时表,遍历原表数据时,根据分组键(key)进行哈希查找。若 key 存在则更新计数,不存在则插入新行。整个过程无需预先排序,时间复杂度是 O(n)。 最后,文章解释了默认情况下我们看到的结果是“有序”的,那仅仅是因为 MySQL 默认在分组后追加了一次排序操作。这与“先排序后分组”的直觉正好相反。

本机暂存
IT 2012-06-14 13:48:05 / 累计浏览 1,606

OPTIMIZER_INDEX_CACHING和OPTIMIZER_INDEX_COST_ADJ参数说明

这篇讲的是Oracle数据库中两个关键优化器参数:OPTIMIZER_INDEX_CACHING 和 OPTIMIZER_INDEX_COST_ADJ 的作用机制与调优实践。作者没有停留在枯燥的参数定义上,而是从优化器决策逻辑的底层出发,清晰拆解了它们如何协同影响执行计划。 文章核心对比了二者的不同作用点:CACHING 参数主要影响优化器对索引块缓存命中率的估算,从而改变索引访问与全表扫描的成本权衡;而 COST_ADJ 则是更直接地为索引路径设定一个全局性的成本调整因子。作者用具体场景说明了何时该调整哪个参数,比如在OLTP系统中倾向于提高CACHING值,而在分析型查询中可能需要谨慎调整COST_ADJ。 更实用的部分在于,文章给出了这些参数的建议值范围、调整步骤以及需要监控的指标,帮助DBA在复杂的业务环境中做出有据可依的配置。整篇文章的落脚点很实在,旨在让读者掌握如何用这两个“旋钮”更精细地调校优化器,以平衡索引利用与系统负载,最终提升查询性能。

本机暂存
IT 2012-06-10 21:59:24 / 累计浏览 3,202

PostgreSQL从菜鸟到专家 数据库的数据存取设计

这篇讲的是,当你使用PostgreSQL时感觉“明明建了索引,查询还是慢”,问题可能出在数据存取的底层设计上。作者从一个常见的性能瓶颈场景出发,系统性地拆解了数据如何在磁盘与内存之间流转。文章深入到了PostgreSQL的行存与列存布局、MVCC机制下数据的多版本存储方式,以及TOAST大字段处理等具体实现层面。它没有停留在“建立合适索引”的通用建议上,而是解释了为什么选择B-tree或Hash索引、何时该用GIN索引处理JSONB,这些选择背后与表的填充因子、死元组清理(VACUUM)策略是如何紧密关联的。通过梳理从插入、更新到查询的全链路,文章阐明了存取设计是一个环环相扣的系统工程,一处不当就可能形成性能短板。对于希望从“会用”PostgreSQL走向“用好”的开发者,这篇文章提供了一张清晰的内部运作地图。

本机暂存
IT 2012-06-10 21:55:07 / 累计浏览 2,777

MySQL数据库InnoDB存储引擎的Group Commit(二)

这篇讲的是MySQL InnoDB存储引擎如何通过Group Commit技术来优化事务提交性能,特别是二进制日志(binlog)刷新与事务提交之间的串行化瓶颈问题。 作者兴奋地指出,Percona Server在其5.5.18-23.0版本中,已经优雅地实现了这一关键优化。其核心方案并非采用常见的“曲线救国”式workaround,而是直接移植了MariaDB数据库中被验证为高效的Group Commit实现。这意味着,多个并发事务在提交时可以被分组,一次性将日志刷盘,从而大幅减少磁盘I/O次数,显著提升高并发场景下的写入吞吐量。 这个实现的巧妙之处在于它以最“正统”的方式解决了历史难题。对于依赖Percona Server进行高性能数据库运维或开发的团队来说,这个版本的发布意味着一个长期以来的性能瓶颈被正式移除,为系统带来了切实的性能收益。

本机暂存
IT 2012-06-10 21:54:35 / 累计浏览 2,644

MySQL数据库InnoDB存储引擎的Group Commit(一)

这篇讲的是MySQL InnoDB存储引擎中一个经典的性能优化问题——Group Commit。文章没有提出新观点,而是基于Kristian Nielsen的四篇深度分析文章,对这个“由来已久”的问题做了一次清晰的梳理。 作者从Group Commit的定义出发,解释了它为什么在InnoDB中如此关键。简单来说,Group Commit是一项旨在提高事务提交性能的技术,通过将多个并发事务的提交操作合并为一次磁盘刷新(fsync),从而显著减少I/O开销。文章点出了它曾引发广泛关注的原因:在早期版本中,这个机制存在缺陷,可能导致严重的性能瓶颈。 目前,这个问题已经得到妥善解决。文章概述了修复方案的核心思路,帮助读者理解InnoDB如何通过改进的Group Commit机制,保障了高并发事务提交时的效率与可靠性。如果你对MySQL内部机制和性能优化的演进感兴趣,这篇文章提供了一个不错的入门总结。

本机暂存
IT 2012-06-07 00:25:04 / 累计浏览 1,440

REPL_AUX链上会不会有脏块?

这篇讲的是Oracle数据库缓冲区管理中的一个具体机制细节。作者从《Oracle Core》一书中关于缓冲区查找的描述出发,聚焦于一个容易让人产生疑惑的点:REPL_AUX链(辅助LRU链)上到底会不会有脏块(dirty buffer)? 文章首先交代了背景,REPL_AUX链设计的初衷是用于链接那些“能马上复用”的缓冲区,比如一致性读块或很少访问的块,目的是为了让进程能快速找到可用空间。但书中也提到,在扫描此链查找空闲缓冲区时,如果发现脏块,会将其移走。 于是作者抛出了核心问题:既然设计如此,那这条链在运行时,是否真的可能存在脏块呢?答案是肯定的。文章解释了在特定场景下,例如当一个缓冲区从主LRU链被淘汰后,即使其内容被修改变“脏”,它也可能被暂时放置在REPL_AUX链上,等待后台进程将其内容写出到磁盘。 这个看似矛盾的细节,恰恰揭示了Oracle缓冲区管理的动态性——链表不是静态分类,而是随着缓冲区状态和访问模式在不断流转。理解这一点,能帮助我们更深入地认识数据库如何在保证性能的同时,协调内存的读写与复用。

本机暂存
IT 2012-06-05 00:09:47 / 累计浏览 2,034

MySQL数据库InnoDB存储引擎 Buffer Pool页面分配详解

这篇讲的是 MySQL InnoDB 存储引擎中一个至关重要的内存区域——Buffer Pool 的页面管理机制。文章从 `innodb_buffer_pool_size` 这个关键参数出发,深入剖析了 InnoDB 是如何在内存中组织和管理数据页与索引页的。作者详细拆解了页面在池中的分配策略、如何高效利用内存空间,特别是针对经典 LRU 算法所做的改进(如加入 young/old 区域),以解决预读失效和全表扫描可能污染缓冲池的棘手问题。 文章的核心价值在于将抽象的内存管理逻辑具象化,清晰地解释了不同访问模式下的页面生命周期和移动规则。对于需要调优数据库性能的工程师来说,理解这些底层细节是合理设置 Buffer Pool 大小、监控 `Innodb_buffer_pool_*` 状态指标的基础。读完之后,你对 “数据库如何用好内存” 这个问题的理解会更加透彻。

本机暂存
IT 2012-06-04 23:57:26 / 累计浏览 5,753

ORACLE最大可以存储多少数据量

这篇从Oracle数据库的存储能力切入,梳理了不同版本、配置和场景下的容量边界。作者对比了标准版与企业版的限制差异,拆解了表空间、数据文件与存储架构的层级关系,并指出在RAC集群或分布式文件系统下如何突破单点瓶颈。文中用实际案例说明了大表分区、LOB字段优化等技巧对数据规模的影响,最后落脚到生产环境中“够用即可”与“预留扩展”的平衡思路,帮助读者理解存储规划背后的工程权衡。

本机暂存
IT 2012-06-04 23:52:43 / 累计浏览 2,816

关于Infobright 的几种数据格式

这篇讲的是Infobright数据库中几种关键数据存储格式的对比与选择。作者从实际应用场景出发,重点剖析了行式存储(如MyISAM)与列式存储(Infobright自有格式)在数据压缩、查询性能上的本质差异。文章用具体数据说明了列式存储在海量数据聚合查询中的速度优势,尤其是其独特的低层数据包与高精度元数据如何实现高压缩比和快速解压。同时也指出了行式存储在点查询和更新操作上的适用性。最后,作者结合不同业务负载特点,给出了格式选型的具体建议:分析型、读密集型场景优先考虑列式格式,而事务型或频繁更新的场景则需谨慎评估。

本机暂存
IT 2012-06-03 14:10:01 / 累计浏览 3,749

一个DBA眼中的HBase

这是一位一线DBA对流行技术的冷静思考。当HBase与NoSQL的光环铺天盖地时,作者从日常运维的视角,剖析了那些光鲜宣传背后的实际挑战。 文章没有复述官方特性,而是直指几个核心痛点:比如高并发写入下的性能瓶颈、复杂查询的局限性,以及运维管理的复杂度。作者结合自身经验,点明了在特定业务场景下可能出现的“水土不服”,例如强一致性要求或复杂Join查询时的尴尬。 其价值不在于否定技术,而是提供了一份来自“用户现场”的平衡报告。它提醒技术决策者,选型不能只看热度,必须紧扣业务特性与团队运维能力。对于正在评估或已深陷HBase运维的团队来说,这篇来自DBA的真诚复盘,或许能帮你避开一些理想的陷阱。

本机暂存
IT 2012-05-28 13:32:30 / 累计浏览 2,121

MariaDB与Percona XtraDB的Group Commit实现原理分析

这篇从MySQL InnoDB存储引擎一个长期存在的bug切入:开启binlog后,由于要保证事务日志与mysqlbinlog的顺序一致性,导致无法进行group commit,这严重影响了高并发写入性能。文章详细剖析了MariaDB与Percona XtraDB这两个主流分支是如何解决这个“老大难”问题的。 核心对比在于它们各自的实现思路。MariaDB通过引入逻辑时钟(lc)来统一排序binlog与InnoDB日志,巧妙地将group commit的决策提前到binlog阶段完成,打破了原本的依赖链。而Percona XtraDB则采取了更为集中的“协调者”模式,在存储引擎层进行统一协调,确保两阶段提交的原子性与性能。两者都通过精巧的设计,在无需改变原有复制逻辑的前提下,恢复了group commit的能力。 文章没有停留在原理对比,还结合代码路径和关键变量,点明了不同实现对复杂度和性能的权衡。对于想深入理解MySQL事务提交内部机制,或者在面临高并发写入瓶颈时做技术选型的读者来说,这篇对底层实现的拆解提供了扎实的参考。

本机暂存
IT 2012-05-28 13:30:22 / 累计浏览 3,167

全表扫描却产生大量db file sequential read一例

这篇文章讲的是开发团队在新系统上线前的数据校验阶段,遇到的一条SQL执行超过一小时仍未结束的典型故障。SQL本身语法很简单,看似只是对一张表进行全表扫描,但实际执行时却产生了大量“db file sequential read”等待事件,这显然与通常全表扫描对应“db file scattered read”的预期相悖,性能问题便由此而来。 作者深入剖析了这一现象。根因在于,表上的索引结构或统计信息存在问题,导致优化器错误地为这条全表扫描SQL选择了通过索引来读取数据的执行计划(Index Full Scan)。每一次通过索引回表读取数据行,都触发了一次“db file sequential read”,数据量一大,I/O开销和响应时间便急剧飙升。 文章不仅揭示了问题本质,还给出了具体的排查步骤与解决方案,例如检查执行计划、更新统计信息或重建索引。对于常与数据库性能问题打交道的开发者和DBA来说,这个案例提醒我们:执行计划的选择有时会很“意外”,全表扫描的性能瓶颈背后,可能隐藏着索引的异常使用。

本机暂存
IT 2012-05-28 13:24:33 / 累计浏览 1,536

MySQL driver(驱动) liblbmysql for Go1

Go 1.0发布后,许多原有MySQL驱动出现了兼容性问题。作者因此编写了liblbmysql这个简易驱动来解决迁移需求。它虽然暂不支持prepare语句,也未完全实现标准sql/driver接口,但足以应对基本的连接与查询场景。 文章以具体示例展示了如何集成该驱动到Go项目中,包括初始化连接和执行简单SQL操作。对于急需在Go 1.0环境下使用MySQL的开发者而言,这是一个轻量且可直接上手的过渡方案。 作者选择分享这个尚未完全开发的工具,是考虑到社区中可能存在相同的迫切需求。如果项目对数据库交互要求不复杂,这个驱动或许能帮上忙。

本机暂存
IT 2012-05-28 13:21:29 / 累计浏览 2,226

使用exp/imp 导入11g数据到9i

这篇讲的是如何用最直接的工具exp/imp,解决一个典型的Oracle版本兼容性难题:将11g数据库的数据导入到老旧的9i环境。核心在于一个容易被忽略的Oracle原则:高版本服务端通常兼容低版本客户端。作者从这里切入,最终发现只需在9i客户端环境下操作就能顺利完成迁移。文章梳理了面对此类需求时常见的几种思路,并验证了这一最有效的方法。没有复杂的格式转换或中间步骤,直接抓住了问题的本质。对于遇到类似跨大版本迁移需求的人来说,这个思路提供了一条清晰、简单的路径。

本机暂存