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

数据库

共 1083 篇文章

IT 2012-05-15 23:28:27 / 累计浏览 2,924

NoSQL 数据建模技术

这篇译文基于"NoSQL Data Modeling Techniques"一文,作者从关系型数据库与NoSQL数据库的对比入手,深入剖析了NoSQL数据建模的核心技术。关系型数据库追求严格的一致性、完整性和高效索引,旨在通过事务保障数据的可靠性;而NoSQL则专注于高可扩展性和性能,往往在一致性方面做出妥协,以换取水平扩展和快速读写能力。 关键差异体现在架构和适用场景上:关系型数据库适合复杂事务和关联查询,如金融或ERP系统;NoSQL则提供多种模型,包括键值存储(如Redis)、文档型(如MongoDB)、列族(如Cassandra)和图数据库(如Neo4j),各自针对特定需求优化。例如,键值存储擅长高速缓存和会话管理,文档数据库便于处理半结构化数据,图数据库则在社交网络分析中表现突出。 文章详细讲解了每种NoSQL建模技术的实现思路和巧妙之处,比如如何通过数据分区、复制和最终一致性来平衡性能与可靠性。译者在前言中分享了个人见解,认为NoSQL由于其灵活性和低延迟特性,特别适合作为缓存层,以减轻关系型数据库的负载并提升系统响应速度。 通过具体案例和对比分析,文章帮助读者

本机暂存
IT 2012-05-14 22:38:29 / 累计浏览 2,681

从MySQL源码学习运维Innodb buffer命中率计算

这篇讲的是如何从MySQL源码层面,彻底搞懂Innodb buffer pool命中率这个关键运维指标的精确计算方法。 很多DBA和开发者都知道这个命中率很重要,但通常只是调用系统变量查看,对于其背后的计算逻辑却比较模糊。这篇文章的作者从源码出发,带领读者一步步追踪。核心实现思路非常清晰:首先,需要从全局性能计数器中获取“逻辑读”和“物理读”的原始数据;其次,计算并非实时进行,而是通过一个固定的采样周期(默认每秒)来完成,这涉及到时间的处理。 更巧妙的地方在于,文章揭示了源码中为了确保计算的准确性,如何巧妙地处理了计数器可能的整数溢出问题,以及在高并发下获取一致性能数据的设计。通过这次源码级的剖析,我们不仅能知道这个数值是多少,更能明白它为什么是这样,让日常的监控和调优工作更有依据。

本机暂存
IT 2012-05-14 22:29:16 / 累计浏览 7,263

索引与优化like查询

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

本机暂存
IT 2012-05-12 22:38:57 / 累计浏览 2,240

记录一次比较棘手数据库恢复要点

这篇讲的是一次堪称“教科书级坑”的数据库异常恢复实录。作者在恢复一个关键业务数据库时,并未遇到单一故障,而是遭遇了归档日志缺失、控制文件损坏、以及数据文件状态不一致的三重难题,让标准恢复流程频频报错。 文章的核心价值在于其“拆弹”过程。作者没有依赖一键恢复,而是细致分析了每条报错背后的深层原因:归档日志链条断裂如何追溯与重建,控制文件备份失效后如何从参数文件和告警日志反向推导其结构,以及在数据文件头损坏时,如何利用数据泵导出与表空间时间点恢复(TSPITR)进行组合式抢救。这些步骤环环相扣,展示了解决复杂、连锁故障的系统性思路。 最终,数据库被成功恢复且数据零丢失。作者在文末总结了恢复前的检查清单和关键命令备忘,对于同样可能面临类似复杂恢复场景的DBA或运维工程师而言,这份“踩坑后”的实战笔记,比任何理论文档都更具即时的参考价值。

本机暂存
IT 2012-05-12 22:35:39 / 累计浏览 2,985

Solr的TrieField范围查询分析

这篇讲的是Solr中TrieField类型为何能在范围查询上实现约10倍性能提升的底层原理。作者没有满足于现象描述,而是从源码层面进行了剖析。 文章的核心在于揭示TrieField(如TrieLongField)的实现巧妙之处。它并非使用传统的平铺数值存储,而是采用了一种基于Trie树(前缀树)的编码结构。这种结构将数值的二进制表示拆解成逐层的节点,从而让范围查询能够像在字典中查找词条一样,通过高效的前缀匹配和树遍历来快速定位数据区间,避免了全量扫描。 通过这次源码分析,作者解释了这一设计如何将查询复杂度从线性降低到对数级别,从而带来巨大的性能优势。对于需要处理海量数据范围检索的开发者而言,理解这种“用空间结构换时间”的思路,比单纯知道“TrieField更快”更有价值。

本机暂存
IT 2012-05-12 22:29:49 / 累计浏览 2,843

常驻连接池(Database Resident Connection Pool)

这篇讲的是Oracle数据库里一个强大但容易被忽视的特性:常驻连接池(DRCP)。作者从传统应用服务器连接池在高并发下连接数爆炸、资源耗尽的痛点出发,引出Oracle在数据库服务端提供的这个解决方案。 文章的核心在于,它把连接池从应用服务器搬到了数据库服务器。传统的连接池(如C3P0、DBCP)在每个应用实例内维护会话,而DRCP则在数据库端统一管理一个共享的连接池。通过“服务端多路复用”这个核心机制,来自不同应用、不同服务器的轻量级“会话”可以复用同一个物理数据库连接。这意味着,即使你有数百个应用服务器实例,数据库也只需维护与应用实例数量级匹配的连接,而非与用户会话数量1:1绑定的庞大连接。 文章进一步拆解了DRCP的工作流程,特别强调了它如何智能地在会话空闲时释放物理连接、只保留一个“代理”进程,并在新请求到来时快速重新绑定。这种设计不仅大幅降低了数据库的内存和进程开销,也提升了系统的可扩展性。 对于需要支撑海量短连接、应用实例众多但每个连接事务不长的场景,比如典型的Web应用或微服务架构,DRCP提供了一种从根源上改变数据库连接管理思路的高阶方案。

本机暂存
IT 2012-05-12 22:28:38 / 累计浏览 3,141

提高短连接监听性能方法测试

这篇讲的是如何通过实测数据对比,优化短连接场景下监听程序的性能。作者从高并发压力测试的需求出发,搭建了模拟环境,重点对比了 select、poll、epoll 这几种 I/O 多路复用模型在监听短连接时的表现差异。 测试脚本的编写是整个实验的基础,文章通过具体数据揭示了关键区别:在连接数急剧增加时,select 和 poll 因线性扫描机制导致性能显著下降,而 epoll 凭借事件驱动与内核级优化,能保持接近 O(1) 的效率。作者进一步剖析了 epoll 在内核实现上的巧妙之处,比如就绪链表和红黑树的设计如何减少无效遍历。 结论很清晰:对于需要处理海量短连接的服务器,epoll 是更优选择,尤其在 Linux 环境下。但文章也指出,select 在跨平台兼容性和实现简单性上仍有其适用场景。整个测试过程扎实,结论对实际架构选型有直接参考价值。

本机暂存
IT 2012-05-12 22:22:25 / 累计浏览 2,124

oracle索引扫描

这篇文章从Oracle数据库最基础的操作——数据检索切入,清晰剖析了“索引扫描”这一核心概念。作者首先指出,与只有一种形式的“全表扫描”不同,索引扫描根据数据量、索引结构和查询条件,实际存在多种高效模式。 文章重点拆解了这几类扫描:比如针对精确匹配的“索引唯一扫描”,处理范围查询的“索引范围扫描”,以及为了优化排序的“索引快速全扫描”。关键的差异点在于每种扫描读取的数据块数量和I/O开销截然不同,直接决定了查询性能的上限。文章通过对比全表扫描“暴力”读取所有数据页的低效,凸显了在合适场景下使用正确索引扫描策略带来的性能飞跃。 通篇没有空谈理论,而是紧密结合执行计划与实际数据访问路径,解释了“何时该用何种扫描”背后的逻辑。对于开发者和DBA而言,理解这些细分类型是进行SQL调优和设计高效索引的必备知识。

本机暂存
IT 2012-05-10 23:33:55 / 累计浏览 1,921

Exadata:存储节点上所有监控指标与其监控概览

Kaya 在 os2ora.com 上分享了这篇关于 Exadata 存储节点监控的深度指南。文章系统性地梳理了存储服务器上所有关键监控指标,从磁盘 I/O、网络吞吐到内存与 CPU 利用率,每一个指标都对应着系统健康状态的特定维度。 作者没有停留在罗列指标的层面,而是深入讲解了如何将这些分散的指标整合成一个清晰的监控概览。文章特别强调了不同指标在性能分析中的关联性,例如如何通过结合等待事件与资源消耗数据来定位瓶颈。对于 DBA 和运维人员来说,这相当于提供了一套完整的“仪表盘解读手册”,帮助他们在日常巡检或故障排查时,能快速抓住重点,理解系统负载背后的含义。 这篇指南的价值在于其极强的实用性,它将枯燥的监控列表转化为一套可操作的监控逻辑,让读者能更有效地利用 Exadata 平台自带的丰富遥测数据来保障数据库环境的稳定与高效。

本机暂存
IT 2012-05-08 00:17:24 / 累计浏览 3,445

PostgreSQL从菜鸟到专家 PostgreSQL介绍

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

本机暂存
IT 2012-05-07 23:55:32 / 累计浏览 4,542

阿里巴巴集团去IOE运动的思考与总结

这篇讲的是阿里巴巴那场轰轰烈烈的“去IOE”运动背后的真实故事与深层思考。 2008年左右,随着用户量与交易量爆发式增长,传统IOE架构(IBM小型机、Oracle数据库、EMC存储)在扩展性和成本上遇到了天花板。作者复盘了这一关键决策点,核心并非简单替换硬件,而是一场从“IOE垂直扩展”到“阿里云分布式架构”的技术范式革命。文章剖析了其中的核心方案:用自研的OceanBase替代Oracle,用“飞天”系统管理成千上万台服务器,以软件定义的弹性与容错能力,应对“双十一”级别洪峰。 最终结论很明确:去IOE不仅是降本增效,更是为整个集团乃至未来的互联网经济打下了云化、智能化的技术地基。这一过程充满了艰难的业务权衡与架构演进,对今天许多面临类似规模化挑战的团队而言,其中的实践路径与思维转变,依然极具参考价值。

本机暂存
IT 2012-05-04 00:17:07 / 累计浏览 1,561

恢复备份控制文件避免resetlogs方式打开数据库

这篇讲的是在Oracle数据库恢复场景中,如何避免使用resetlogs方式打开库的问题。作者从日常运维中的一个常见痛点出发:当我们使用备份控制文件完成恢复后,通常需要resetlogs操作才能打开数据库,而这会重置日志序列号,可能影响后续恢复策略。有没有办法跳过这一步? 文章通过一个完整的Oracle 9i实验来演示解决方案。核心思路是,在使用备份控制文件恢复数据库并完成介质恢复后,先生成控制文件的跟踪脚本,然后关闭数据库并以nomount模式启动,依据脚本重建控制文件。实验过程中,作者遇到了典型的ORA-01589错误,明确提示需要resetlogs选项,这正是要绕过的障碍。 关键步骤在于,通过重建的控制文件重新控制数据库后,就能直接执行alter database open命令,顺利打开库而无需resetlogs。整个流程清晰展示了从备份控制文件恢复到最终正常启动的完整路径。这个方法为需要保持日志历史连续性的恢复场景提供了一种实用的技术选择。

本机暂存
IT 2012-05-04 00:09:51 / 累计浏览 2,945

oracle索引扫描

这篇讲的是Oracle数据库中两种截然不同的数据访问路径:全表扫描与索引扫描。作者开宗明义地指出,全表扫描只有一种形式,就是按顺序读取整个表的所有数据块;而索引扫描则是一个“家族”,根据数据的分布和查询条件的不同,可以分为索引范围扫描、索引唯一扫描、索引全扫描等多种类型。 文章的核心价值在于清晰剖析了这种差异背后的原理。全表扫描好比一本一本翻书找信息,效率取决于书的总页数;而索引扫描则像是先查阅目录(索引)获得精确的页码,再直接跳转过去。作者通常会强调,当查询条件命中高选择性的索引时,索引扫描能极大减少需要读取的数据量,从而显著提升查询性能。相反,在某些情况下,比如需要返回表中大部分数据时,优化器可能反而会选择全表扫描,因为此时使用索引再回表可能代价更高。 这篇内容帮助数据库开发者和DBA建立起一个关键认知:没有绝对的好坏,只有合适的场景。理解各类索引扫描的工作机制,是分析SQL执行计划、进行性能调优的基础功课。

本机暂存
IT 2012-05-04 00:06:01 / 累计浏览 3,621

查看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:14:04 / 累计浏览 4,082

多版本并发控制(MVCC)在分布式系统中的应用

这篇讲的是多版本并发控制(MVCC)这一经典机制如何从单体数据库走向复杂的分布式世界。作者从大家熟悉的MySQL InnoDB引擎入手,梳理了MVCC通过版本链实现无锁读、提升并发性能的核心原理。但文章的重点在于,当系统从单机扩展到分布式时,传统的MVCC方案会遇到新挑战,比如如何在多节点间协调版本号、处理网络分区下的读写冲突。 文章对比了Google Spanner的TrueTime方案和基于向量时钟(Vector Clock)的两种主流思路。TrueTime通过硬件时钟提供全局时间戳,但依赖高精度时钟同步;向量时钟则完全通过逻辑关系来追踪因果,更适合无时钟基础设施的环境。作者深入分析了这两种方案在一致性、性能和实现复杂度上的关键权衡,并最终指向一个现实结论:没有银弹,选择哪种MVCC演进方案,紧密依赖于业务场景对一致性、可用性和性能的具体要求。

本机暂存
IT 2012-05-03 00:03:43 / 累计浏览 3,822

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,141

关于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,522

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-27 00:06:18 / 累计浏览 7,086

派出所所长到互联网架构师的传奇人生

这篇讲的是一位派出所所长跨界转型为互联网架构师的真实历程。作者从执法一线的实际工作出发,分享了自己如何利用业余时间系统学习编程与架构设计,最终完成职业赛道的彻底切换。文章细致描述了转型过程中遇到的技术思维与管理经验的融合挑战,比如如何将公安系统中严谨的流程化思维,应用于高并发分布式系统的稳定性设计。 核心观点在于,看似不相关的岗位经历,实际上能为技术架构带来独特的复合视角。文中举例说明,在处理一次支付系统故障排查时,作者凭借刑侦经验中的“现场保护”与“逻辑还原”方法,快速定位到问题根因是缓存雪崩与降级策略的冲突。这种将非技术领域方法论迁移至技术问题解决中的实践,为架构设计注入了新的思考维度。 文章不仅还原了个人职业蜕变的时间线与技术栈选择,更透过具体案例揭示了跨行业背景所塑造的系统性思维优势。对于面临职业瓶颈或寻求技术突破的读者而言,这篇分享提供了一种跳出固有框架的可能性:不同领域的经验碰撞,往往能催生出更健壮、更接地气的技术解决方案。

本机暂存
IT 2012-04-26 23:38:05 / 累计浏览 3,944

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

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

本机暂存