为什么80%的码农都做不了架构师?>>>   

数据库索引--基本知识

有许多因素会影响数据库性能。最明显的是数据量:您拥有的数据越多,数据库的速度就越慢。虽然有很多方法可以解决性能问题,但主要的解决方案是正确索引数据库。

为什么需要数据库索引?

要回答这个问题,我们将讲述一个故事。让我们假设我们管理一个图书馆,我们有一个数据库来存储有关我们图书的信息。对于每本书,我们存储条形码,标题,作者,流派,出版商和出版年份。我们可以将所有这些保存在一个大文件中,每行代表一本书。在这种情况下,根据记录的添加时间,书籍的顺序将按时间顺序排列。 如果我们想找一本书,我们需要扫描列表中的每一条记录。从文件的开头开始,我们将测试每条记录的搜索条件。在我们找到第一个匹配值后,搜索将被终止 - 这可能是最后一个记录!从技术上讲,这种方法有效;但随着我们的文件变大,对性能的影响将变得更加明显。在某些时候,我们的系统将变得无法使用。 此方案可以轻松应用于数据库,还有一些其他因素。例如,每个数据库记录应至少有一个唯一键。该密钥可能包含一些实际数据,但在大多数情况下,它只是一个自动分配的数值。要在我们的数据库中查找任何给定记录,我们必须使用:

  1. 主键值,如果我们知道的话。请记住,主键不是真实数据,所以我们很少有机会知道这个值。
  2. 真实的值,如书的标题或作者。

即使有了这些信息,对大量数据进行排序也很耗时。只需要查看您所在城市主图书馆中每本书的清单,即可找到一个标题!幸运的是,有一种更有效的方法可以完成任务。 为了加快速度,可以依赖于数据库索引。

什么是数据库索引?

数据库索引是一种专用数据结构,允许我们快速定位信息。它的组织方式类似于二叉树结构,左侧值较小,右侧值较大。索引可以比较树状结构中的行值,以更快地定位所需数据,而不是强制扫描整个表。

当我们在一个或多个列上创建索引时,我们将它们的值存储在新结构中,还存储指行的指针。这行为会重新组织并排序信息,但不会改变信息本身。可以将数据库索引视为书后面的索引。虽然它存储了一些实际信息,但它还包含指针,指针指向可以找到更多详细信息的位置。

按照我们的搜索条件对数据进行排序后,查找所需的记录会变得更加简单。想象一下按字母顺序排序的旧电话簿。知道某人的姓氏,名字和地址意味着您可以很快找到他们的电话号码。但是如果你只知道别人的地址和名字怎么办?没有姓氏,找到电话号码将非常困难。您可以使用反向电话簿做得更好,该目录列出了基于地址的电话号码。

在数据库中,更改搜索条件通常意味着为属性组合创建新索引。如前所述,添加这些索引需要额外的磁盘空间。添加,删除或更新值时,还会对索引进行更改。

为什么索引很重要 - 背后的数学原理

在大多数情况下,我们可以使用索引比通过数据库顺序搜索更快地找到数据。例外情况是我们的数据库中只有几条记录。如果我们在公式中表达这个,t = time,那么t<sub>using_index</sub> < t<sub>sequential search</sub>。我们可以计算这些值,计算结果是算法复杂度的公式。

算法复杂度决定了执行操作所需的时间。由于硬件配置不同,我们将使用数据集中的数据量作为参数,其中n =数据库中的记录数。所以,如果我们的图书馆有1000000本书,那么n = 1000000。

如果我们想找到哈克贝利·费恩历险记的记录,我们必须查看每个单独的书名,直到找到合适的书名。如果n = 1000000,这意味着平均会有50万本书!此顺序过程称为全表扫描,算法复杂度(n / 2)与数据集的大小直接相关。我们将使用O(n)指向它。注意:“O”用于描述算法中最重要的术语。例如,如果我们计算算法具有2n<sup>3</sup> + 4n + 21操作,则该算法的大O表示法是O(n<sup>3</sup>)。

另一方面,如果我们在title属性上使用索引,我们可以更快地找到我们的记录。如果这些书籍已按字母顺序按标题排列,我们只需查看中间的书籍(第500000条记录)。如果我们的期望值出现在此记录之前,我们将在左侧数据子集中搜索它;否则,我们会查看正确的子集。通过继续将我们的列表分成两半,我们将找到我们想要的记录。我们需要重复这个过程的最多次数是20次(2 ^ 20 = 1048576)。这种算法的复杂性表示为O(log(n))。

显然,索引方法获得了更好的结果。使用它有一个先决条件,那就是在title属性上有一个索引。这将导致更快的搜索操作,但是在添加和删除数据时,我们将丢失一些磁盘空间并且性能会降低。

示例数据库模型

我们将使用此模型来解释本文和即将发表的文章中的索引。它旨在存储有关我们图书馆书籍的所有相关数据。

我不会进入模型细节,最重要的是要知道一些表格:

  1. 是字典,我们不期望经常改变。
  2. 包含大量数据(book,book_details,book_genre,book_author)。

如何创建索引

添加新索引需要更多磁盘空间。如果我们尝试索引每个属性和所有可能的组合,我们最终可能会遇到比我们最初的更差的性能。因此,在考虑新索引时,请记住:

  1. 仅在我们期望大量数据的表中添加索引。在我们的模型中,可能是book_details表。
  2. 只为我们希望经常搜索的属性添加索引;例如,假设人们将搜索书名是合乎逻辑的,因此book_title属性将具有索引。
  3. 如果UNIQUE无法帮助我们,请在字段中添加索引。例如,在book_details中,几本书完全有可能具有相同的名称。
  4. 如果我们为索引使用多个字段,我们必须正确地对它们进行排序。

我们可以使用以下SQL语句轻松地在book_title属性上创建索引:

CREATE INDEX book_details_idx_1 ON book_details (book_title);

以下代码,用于创建表:

-- Table: book_details
CREATE TABLE book_details (id int NOT NULL AUTO_INCREMENT,book_title varchar(255) NOT NULL,edition text NULL,publisher varchar(255) NULL,publish_year int NULL,language_id int NOT NULL,CONSTRAINT book_details_pk PRIMARY KEY (id)
)
COMMENT 'list of all book titles';
CREATE INDEX book_details_idx_1 ON book_details (book_title);
-- End of file.

使用相同的逻辑,我们将在author表上创建另外两个索引。第一个索引使用first_name列,然后使用last_name列。第二个索引反转此顺序,首先使用last_name列,然后使用first_name列。它们看起来可能相同,但索引中列的顺序至关重要;创建索引,以便索引中最左边的属性是您首先使用的属性。

为什么同一属性上有两个索引?人们可能会以几种不同的方式搜索作者。第一个索引author_idx_1允许我们仅使用first_name - last_name对或first_name属性查找记录。但它不适用于last_name-- first_name对甚至last_name属性。第二个索引author_idx_2将执行此操作。因此,无论作者的姓名如何输入搜索,都会返回有意义的结果。

我们表的CREATE TABLE语句现在如下所示:

-- tables
-- Table: author
CREATE TABLE author (id int NOT NULL AUTO_INCREMENT,first_name varchar(255) NOT NULL,last_name varchar(255) NOT NULL,birth_date date NULL COMMENT 'it is here just to distinguish authors with same first and last name (if any)',CONSTRAINT author_pk PRIMARY KEY (id)
)
COMMENT 'authors list';
CREATE INDEX author_idx_1 ON author (first_name,last_name);
CREATE INDEX author_idx_2 ON author (last_name,first_name);
-- End of file.

使用数据库索引需要注意的事情

如果一个表有一个或多个索引,它肯定会减慢INSERT操作。这是因为当记录添加到表中时,它必须在正确的位置。因此,需要调整索引,这需要时间。

如果我们期望具有索引的表发生重大更改,我们可以先删除索引,插入新记录,然后重新创建索引。根据具体情况,这可能是更快的解决方案。在我们的模型中,如果我们要添加大量新书,那么删除索引是有意义的。假设我们准备一份新书及其相关数据列表并在工作时间后运行脚本是合理的。

自动索引的一些情况

  1. 将自动为主键创建索引。在我们所有的表中,主键都被称为id。它是int类型,autoincrement设置为yes。
  2. 在MySQL InnoDB引擎中,还会自动为外键创建索引。
  3. 如果将属性定义为UNIQUE,则还会自动在其上创建索引,就像对主键一样。

在以上情况下,都会在键值上创建索引,从而加快搜索操作(当使用id作为搜索参数时)。这有助于我们知道id并且我们想要检索,更新或删除该记录的值。 索引非常强大。它们允许我们更快地执行搜索和排序操作。但是这个速度需要付出代价:创建索引需要磁盘空间并且可能会降低其他操作的速度。

原谅链接:https://www.vertabelo.com/blog/technical-articles/all-about-indexes-the-very-basics

转载于:https://my.oschina.net/zho/blog/3016252

数据库索引-基本知识相关推荐

  1. MongoDB数据库索引基础知识与实战技巧

    本文内容源自Kyle Banker 的MongoDB In Action一书.主要描述了MongoDB索引相关的一些基础知识和使用技巧. 索引类型 虽然MongoDB的索引在存储结构上都是一样的,但是 ...

  2. Mysql数据库(四)——mysql索引相关知识

    Mysql数据库(四)--mysql索引相关知识 一.索引的概念 二.索引的优缺点 1.优点 2.缺点 三.创建索引的原则 四.索引的分类和创建方法 1.普通索引 ①.直接创建索引 ②.修改表方式创建 ...

  3. SQL Server调优系列进阶篇(如何维护数据库索引)

    前言 上一篇我们研究了如何利用索引在数据库里面调优,简要的介绍了索引的原理,更重要的分析了如何选择索引以及索引的利弊项,有兴趣的可以点击查看. 本篇延续上一篇的内容,继续分析索引这块,侧重索引项的日常 ...

  4. 数据库索引是什么?新华字典来帮你!

    点击蓝色"程序猿DD"关注我哟 来源:https://zhuanlan.zhihu.com/p/57359378 学过服务器端开发的朋友一定知道,程序没有数据库索引也可以运行.但是 ...

  5. 大于小于优化_以MySQL为例,详解数据库索引原理及深度优化

    本文内容主要来源于互联网上主流文章,只是按照个人理解稍作整合,后面附有参考链接. 一.摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引 ...

  6. [推荐]数据库索引碎片的自动重建或重组

    [推荐]数据库索引碎片的自动重建或重组 [推荐]数据库索引碎片的自动重建或重组 --通过知识共享树立个人品牌.   数据库随着使用时间,若不进行相应管理就会越来越慢,优化数据库方法很多,在此不介绍,说 ...

  7. sql server修改索引名称_索引基本知识和索引优化

    " 索引基本知识*哈希索引*组合索引*聚簇索引与非聚簇索引*覆盖索引*索引优化*索引监控*优化案例" 索引这个东西,个人的感觉是:平时大家都不怎么重视他,感觉哪个查询慢了就对那个列 ...

  8. [转]SQL Server 索引基础知识(2)----聚集索引,非聚集索引

    SQL Server 索引基础知识(2)----聚集索引,非聚集索引 [来自]http://blog.joycode.com/ghj/archive/2008/01/02/113291.aspx 由于 ...

  9. 大于小于优化_架构 - 以MySQL为例,详解数据库索引原理及深度优化

    一.摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如 ...

最新文章

  1. delphi libeay32 各版本_Zbrush各版本合集
  2. 阿尔法大蛋智能机器人功能_智能机器人怎么选?阿尔法蛋大蛋2.0助力孩子新学期...
  3. 【无码专区9】序列统计(带权并查集 + 前缀和建边 + dp)
  4. tableau三轴该怎么做_如何用tableau绘制城市地铁线路图?
  5. [js] 在DOM上同时绑定两个点击事件(一个用捕获,一个用冒泡),事件总共会执行几次,先执行哪个事件?
  6. Splay初步【bzoj1503】
  7. 脉冲神经网络的开发公司AI-CTX
  8. vscode extension
  9. Swift - 继承UIView实现自定义可视化组件(附记分牌样例)
  10. 关于N卡录制双音轨问题以及PR2020 注册机
  11. 修改文件类型图标得方式
  12. 民族学类毕业论文文献有哪些?
  13. js pug 代码_Pug模板(一)
  14. 前端页面兼容性问题学习
  15. 吃不了读书的苦,注定要吃一生的苦
  16. 树莓派各版本引脚及参数
  17. 不小心删除了网络适配器中的无线网卡驱动?
  18. 【clion】Clion安装与配置
  19. keil5打开kil4工程不兼容 device无法选择芯片
  20. 李炎恢老师sql语句(6)

热门文章

  1. C语言之分支结构 if(一)
  2. 朴素高精度乘法的常数优化
  3. HibernateTemplate 查询
  4. TOJ--3456--数学题
  5. UVa 10180 - Rope Crisis in Ropeland!
  6. SQLServer中设置XML索引
  7. Android studio安装与调试
  8. PHP使用curl_multi_add_handle并行处理
  9. 设置Sysctl.conf用以提高Linux的性能(最完整的sysctl.conf优化方案)
  10. Redis源码分析--lookupKey函数查看value值