第 0 章 为什么说设计索引是开发人员的职责?

Posted 不剪发的Tony老师

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第 0 章 为什么说设计索引是开发人员的职责?相关的知识,希望对你有一定的参考价值。

文章目录

大家好,我是只谈技术不剪发的 Tony 老师。

从今天开始,我们将会开始一个新的系列专栏《开发人员数据库性能指南》,面向开发人员介绍 SQL 索引和查询优化的原理,不涉及到任何索引管理的内容。这是一个翻译文章系列,原文来自 https://use-the-index-luke.com/,了解英文的小伙伴可以直接查看原文,或者也可以购买英文原版书籍《SQL Performance Explained》

SQL 性能问题伴随 SQL 的诞生而存在,某些人甚至认为 SQL 天生效率低下。虽然以上观点在 SQL 早期可能成立,但是现如今早就不是这样了。尽管如此,SQL 性能问题仍然普遍存在,为什么会这样呢?

SQL 语言可能是最成功的第 4 代编程语言,它的最大优势是区分了“需要什么”和“如何实现”。SQL 语句直接描述了想要的结果,而不需要关心如何实现这个结果,也就是说 SQL 具有声明性。让我们考虑以下示例:

SELECT date_of_birth
  FROM employees
 WHERE last_name = 'WINAND'

SQL 查询读起来就像是英语一样,描述了需要的数据。编写 SQL 语句通常不需要任何关于数据库或者存储系统(例如磁盘文件等)相关的知识。我们不需要告诉数据库打开哪个文件或者如何找到需要的数据行。很多具有多年 SQL 经验的开发人员并不了解数据库内部的处理过程。

“需要什么”和“如何实现”的分离方式在 SQL 中工作的非常好,但仍然并不完美。这种抽象处理无法突破性能的极限:编写 SQL 语句的开发人员并不关心数据库如何执行这些语句。因此,开发人员不需要对慢查询负责。然而,经验证明的结果正好相反。例如,开发人员需要了解一些数据库知识,从而避免产生性能问题。

事实证明,开发人员唯一需要学习的就是如何设计索引。数据库索引设计实际上是开发人员的职责,这是因为创建合适索引最重要的信息不是存储系统的配置或者硬件的设置,而是应用程序如何查询数据。对于数据库管理员(DBA)和外部顾问人员来说,想要了解关于数据访问路径的相关知识并不容易。通过应用程序的反向工程搜集这些信息需要相当长的时间,而另一方面,开发人员总是能够获取这些信息。

这个系列文章只涉及开发人员需要了解的索引知识,没有其他内容。准确地说,只包含最重要的索引类型:B-树索引。

B-树索引在很多数据库中的工作方式几乎相同。文章中主要使用 Oracle 数据库的术语,但是在适当的情况下会参考其他数据库中的术语。备注提供了更多关于 mysql、PostgreSQL 以及 Microsoft SQL Server 的信息。

文章结构专门为开发人员进行了定制,大多数的章节都对应了 SQL 语句中的特定部分。

  • 第一章 索引的原理。这是唯一不涉及具体 SQL 的章节,主要介绍索引的基础结构。理解索引结构是查询优化的基础。

  • 第二章 WHERE 子句。本章描述 WHERE 子句的各种情况,从简单的单列查找到复杂的范围查询以及特殊的查询条件(例如 LIKE)。本章包含了专栏的主要内容,学会了这些技术就可以编写出更加高效的 SQL 语句。

  • 第三章 性能与可扩展性。本章稍微偏离了一点主题,讨论了一些关于数据库性能度量和可扩展性的问题,介绍了为什么增加硬件不是解决慢查询的最佳方法。

  • 第四章 连接操作。让我们回到 SQL 语句:本章介绍如何利用索引快速实现表的连接。

  • 第五章 聚集数据。你有没有想过查询一个字段和查询全部字段的区别?本章将会进行解释,同时还会介绍一些相关的性能优化技巧。

  • 第六章 排序与分组。索引可以用于优化排序和分组操作。

  • 第七章 获取部分结果。如果我们不需要返回全部的结果集,可以利用“管道式”执行方法提高性能。

  • 第八章 插入、删除和更新。索引对数据库修改操作有什么性能影响?索引需要付出一定的代价,我们需要合理地使用索引!

  • 附件 A 执行计划。解释如何在不同的数据库中获取执行计划,并对执行计划进行解释。

  • 附件 B 谣言。列出了关于数据库性能的一些常见谣言并解释真相。

  • 附录 C 示例模式。文章中使用的示例表和数据的创建脚本。

文章包含的数据库产品和版本包括:

  • MySQL 5.5 - MySQL 8.0
  • Oracle 11g - Oracle 19c
  • Microsoft SQL Server 2008R2 - 2019
  • PostgreSQL 9.0 - PostgreSQL 12
  • Db2 LUW V10.5 - Db2 LUW 11.5

如果你对数据库索引和 SQL 性能优化感兴趣,欢迎关注这个专栏我们一起学习!

以上是关于第 0 章 为什么说设计索引是开发人员的职责?的主要内容,如果未能解决你的问题,请参考以下文章

设计模式@第26章:职责链模式

《敏捷软件开发》第4章测试

敏捷开发:原则,模式与实践——第8章 单一职责原则SRP

面向对象思想设计原则

JavaScript设计模式与开发实践

[Python设计模式] 第3~5章 单一职责原则/开放-封闭原则/依赖倒转原则