MySQL进阶之索引

目录
  • 索引概述
    • 介绍
    • 特点
  • 索引结构
  • 索引进化的过程
    • B-Tree

索引概述

介绍

索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足 特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据, 这样就可以在这些数据结构 上实现高级查找算法,这种数据结构就是索引。

索引就是一种数据结构,这种结构类似,链表,树等等。但是比它们要复杂的多。

为什么要用索引呢?

假如我们有如下数据

如果我们要查询年龄=45的全部信息。

select * from tb_user where age = 45;

那么SQL是如何查询呢?

MySQL需要进行全表扫描,然后对比每条数据中的age值是否是45。

加入我们要100个数据,那你继续全表扫描找出age = 45;岂不是太麻烦了?

这是你是否想起来数据结构中二叉搜索树?我们将age的值映射到这个二叉搜索树上,那么我们就可以快速查找到我们要的结果。age 到二叉搜索树的过程就是索引。

注意:我们仅仅用二叉搜索树举例子,想信你肯定知道MySQL中的索引肯定比这个复杂。

此时我们对索引的理解更加深入了,索引仅仅是建立了一个数据结构,把数据存入到这个结构上,方便MySQL查找数据罢了。

特点

索引结构

MySQL的索引是在存储引擎层实现的,不同的存储引擎有不同的索引结构,主要包含以下几种

上述是MySQL中所支持的所有的索引结构,接下来,我们再来看看不同的存储引擎对于索引结构的支持 情况。

我们主要看InnoDB就可以了,因为MyISAM会被MongoDB代替,Memory会被Redis代替。

我们一般指的索引是指的是B+tree。

当然B+tree肯定不是一上来就提出来的,肯定是有一个进化的过程。

索引进化的过程

我们都知道二叉搜索树是一个方便存储的结构,因为其天然的排序。左子树都小于中间节点,右子树都大于中间节点。

但是它有什么缺点呢?在极端情况下会退化成链表。查找时间复杂度O(n),这不就等效于全表查询了?

如何克服呢?使用红黑树,因为它是一种平衡二叉树。可以避免出现链表这种极端情况。

那么是不是使用红黑树就可以了?答案:还是不行,不够理想。

为什么呢?因为是二叉树,如果MySQL中数据过多,那么将会出现树的层级过深。

我们知道数据以Page为单位存入的,在Page切换查询时会出现磁盘IO操作。层级过深就会造成IO频繁。

如何解决上述问题呢?B-Tree出场。

B-Tree

B-Tree,B树是一种多叉路衡查找树,相对于二叉树,B树每个节点可以有多个分支,即多叉。 以一颗最大度数(max-degree)为5(5阶)的b-tree为例,那这个B树每个节点最多存储4个key(每个key都可以存放数据),5 个指针:

是不是使用b树就可以了呢?原则上是可以了,但是还有一种更优的方案B+Tree 代替了BTree。

MySQL中的B+Tree 和BTree有什么不同呢?

  • B+Tree只在叶子节点存储数据,从而保证每个Page中存入更多的key。
  • 叶子节点包含了根节点和非叶子节点--图中红框显示。
  • 叶子节点采用双向循环链表连接,方便查找。

因此我们可以回答:为什么MySQL采用B+Tree呢?

到此这篇关于MySQL进阶之索引的文章就介绍到这了,更多相关MySQL索引内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • MySQL中索引的优化的示例详解

    目录 使用索引优化 数据准备 避免索引失效应用-全值匹配 避免索引失效应用-最左前缀法则 避免索引失效应用-其他匹配原则 使用索引优化 索引是数据库优化最常用也是最重要的手段之一,通过索引通常可以帮助用户解决大多数的MySQL的性能优化问题. 数据准备 use world; create table tb_seller( sellerid varchar(100), name varchar(100), nickname varchar(50), password varchar(60), st

  • 深入解析MySQL索引的原理与优化策略

    目录 索引的概念 索引的原理 索引的类型 索引的使用 索引的使用方式 注意事项 索引优化技巧 索引的概念 MySQL索引是一种用于加速数据库查询的数据结构,它类似于书籍的目录,能够快速指导我们找到需要的信息.MySQL索引可以根据一定的算法和数据结构进行排序和存储,从而实现高效的数据查找和访问.在数据库中,索引可以加速数据的查询和更新操作,提高系统性能. MySQL支持多种索引类型,常见的包括B-tree索引.哈希索引和全文索引等.其中,B-tree索引是最常用的一种,它是一种平衡树结构,可以将

  • MySQL索引总结(Index Type)

    目录 MySQL Index 1.创建和删除索引 2. 索引类型 MySQL Index 索引是一种数据结构,可以是B-tree.R-tree.或者hash结构.其中,B-tree适用于查找某范围内的数据,可以快速地从当前数据找到吓一跳数据:R-tree常用于查询比较接近的数据:hash结构适用于随机访问场景,查找每条数据时间几乎一致. 优化查询的有效方法是为经常查询的字段建立索引,如无索引查询数据时,会遍历整张表:若建立索引后查找起来会更快速.当进行update.delete.insert操作

  • MySQL约束与索引概念详解

    目录 一.关系型数据库设计规则 二.数据完整性和约束与索引的概念 三.约束的应用 一.关系型数据库设计规则 遵循ER模型和三范式 E entity 代表实体的意思 对应到数据库当中的一张表 R relationship 代表关系的意思 三范式: 1.列不能拆分 2.唯一标识 3.关系引用主键 具体体现 将数据放到表中,表再放到库中. 一个数据库中可以有多个表,每个表都有一个名字,用来标识自己.表名具有唯一性. 表具有一些特性,这些特性定义了数据在表中如何存储,类似java和python 中 “类

  • MySQL进阶之索引

    目录 索引概述 介绍 特点 索引结构 索引进化的过程 B-Tree 索引概述 介绍 索引(index)是帮助MySQL高效获取数据的数据结构(有序).在数据之外,数据库系统还维护着满足 特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据, 这样就可以在这些数据结构 上实现高级查找算法,这种数据结构就是索引. 索引就是一种数据结构,这种结构类似,链表,树等等.但是比它们要复杂的多. 为什么要用索引呢? 假如我们有如下数据 如果我们要查询年龄=45的全部信息. select * from

  • 浅谈MySQL和Lucene索引的对比分析

    MySQL和Lucene都可以对数据构建索引并通过索引查询数据,一个是关系型数据库,一个是构建搜索引擎(Solr.ElasticSearch)的核心类库.两者的索引(index)有什么区别呢?以前写过一篇<Solr与MySQL查询性能对比>,只是简单的对比了下查询性能,对于内部原理却没有解释,本文简单分析下两者的索引区别. MySQL索引实现 在MySQL中,索引属于存储引擎级别的概念,不同存储引擎对索引的实现方式是不同的,本文主要讨论MyISAM和InnoDB两个存储引擎的索引实现方式. M

  • Mysql数据库之索引优化

    MySQL凭借着出色的性能.低廉的成本.丰富的资源,已经成为绝大多数互联网公司的首选关系型数据库.虽然性能出色,但所谓"好马配好鞍",如何能够更好的使用它,已经成为开发工程师的必修课,我们经常会从职位描述上看到诸如"精通MySQL"."SQL语句优化"."了解数据库原理"等要求.我们知道一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,

  • MySQL中字符串索引对update的影响分析

    本文分析了MySQL中字符串索引对update的影响.分享给大家供大家参考,具体如下: 对某一个类型为varchar的字段添加前缀索引后,基于该子段的条件查询时间基本大幅下降:但对于update操作,所耗的时间却急剧上升,主要原因是在更新数据的同时,mysql会执行索引的更新. 下面做了一个简单的试验. (1)首先对某个亿级记录的表字段所有记录执行更新: for idx in range(1, count+1): sql = "update tbl_name set platforms='&qu

  • MySQL Order By索引优化方法

    尽管 ORDER BY 不是和索引的顺序准确匹配,索引还是可以被用到,只要不用的索引部分和所有的额外的 ORDER BY 字段在 WHERE 子句中都被包括了. 使用索引的MySQL Order By 下列的几个查询都会使用索引来解决 ORDER BY 或 GROUP BY 部分: 复制代码 代码如下: SELECT * FROM t1 ORDER BY key_part1,key_part2,... ; SELECT * FROM t1 WHERE key_part1=constant ORD

  • 通过实例认识MySQL中前缀索引的用法

    今天在测试环境中加一个索引时候发现一警告 root@test 07:57:52>alter table article drop index ind_article_url; Query OK, 144384 rows affected (16.29 sec) Records: 144384 Duplicates: 0 Warnings: 0 root@test 07:58:40>alter table article add index ind_article_url(url); Query

  • mysql下普通索引和唯一索引的效率对比

    今天在我的虚拟机中布置了环境,测试抓图如下: 抓的这几个都是第一次执行的,刷了几次后,取平均值,效率大致相同,而且如果在一个列上同时建唯一索引和普通索引的话,mysql会自动选择唯一索引. 谷歌一下: 唯一索引和普通索引使用的结构都是B-tree,执行时间复杂度都是O(log n). 补充下概念: 1.普通索引 普通索引(由关键字KEY或INDEX定义的索引)的唯一任务是加快对数据的访问速度.因此,应该只为那些最经常出现在查询条件(WHEREcolumn=)或排序条件(ORDERBYcolumn

  • MySQL中利用索引对数据进行排序的基础教程

    MySQL中,有两种方式生成有序结果集:一是使用filesort,二是按索引顺序扫描.利用索引进行排序操作是非常快的,而且可以利用同一索引同时进行查找和排序操作.当索引的顺序与ORDER BY中的列顺序相同且所有的列是同一方向(全部升序或者全部降序)时,可以使用索引来排序.如果查询是连接多个表,仅当ORDER BY中的所有列都是第一个表的列时才会使用索引.其它情况都会使用filesort. MySQL索引通常是被用于提高WHERE条件的数据行匹配或者执行联结操作时匹配其它表的数据行的搜索速度.

  • MySQL进阶SELECT语法篇

    MySQL中SELECT语句的基本语法是:  SELECT [STRAIGHT_JOIN] [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [HIGH_PRIORITY] [DISTINCT|DISTINCTROW|ALL] select_list [INTO {OUTFILE|DUMPFILE} 'file_name' export_options] [FROM table_references [WHERE where_definition] [GROUP BY co

  • MySQL中对于索引的基本增删查改操作总结

    创建索引 MySQL创建索引的语法如下: CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name [USING index_type] ON table_name (index_col_name,...) 其中对应的语法变量信息如下: [UNIQUE|FULLTEXT|SPATIAL] 中括号中的这三个关键字表示创建的索引类型,它们分别表示唯一索引.全文索引.空间索引三种不同的索引类型.如果我们不指定任何关键字,则默认为普通索引. index_name

随机推荐