mysql 动态索引_MySQL的索引

在日常工作中,我们经常会用到mysql的索引。使用索引的目的基本上就是为了在大量的数据中快速找出某个列中一个特定值的行,简单说就是提高查询效率。

使用索引的优点:

可以快速检索,减少I/O次数,加快检索速度;

根据索引分组和排序,可以加快分组和排序。

当然索引也有缺点:

索引是数据结构,索引是存储在表中的,创建索引和维护索引需要时间,而且数据量越大时间越长

创建索引需要占据磁盘的空间,如果有大量的索引,可能比数据文件更快达到最大文件尺寸

当对表中的数据进行增加,修改,删除的时候,索引也要同时进行维护,降低了数据的维护速度

索引的分类:

常见的索引类型有:主键索引、唯一索引、普通索引、全文索引、组合索引

普通索引(Normal):基本索引类型,允许在定义索引的列里插入空值或重复值。

唯一索引(Unique):索引列值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。

主键索引是一种特殊的唯一索引,不允许有空值

单列索引:只包含一个列的索引,一个表中可以有多个

组合索引:包含多个列的索引,查询条件包含这些列的最左边的字段的时候,索引就会被引用,遵循最左缀原则

全文索引:用大文本对象的列构建的索引

索引的设计原则:

首先索引并不是不是越多越好,而且对于常更新的表索引越少越好。

数据量小的表最好不要建立索引

不同的值比较多的列才需要建立索引

某种数据本身具备唯一性的时候,建立唯一性索引,可以保证定义的列的数据完整性,以提高查询熟度

频繁进行排序或分组的列(group by或者是order by)可以建立索引,提高搜索速度

经常用于查询条件的字段应该建立索引

索引需要占用磁盘空间,因此在创建索引时要考虑到磁盘空间是否足够。而且创建索引时需要对表加锁,因此实际操作中需要在业务空闲期间进行。

索引的实现原理:

Mysql本身支持多种存储引擎,所以可以支持多种索引。如BTree索引,哈希索引,全文索引等。mysql默认存储引擎innodb只显式支持B-Tree( 从技术上来说是B+Tree)索引,对于频繁访问的表,innodb会透明建立自适应hash索引,即在B树索引基础上建立hash索引,可以显著提高查找效率,对于客户端是透明的,不可控制的,隐式的。

B+树索引是B+树在数据库中的一种实现,是最常见也是数据库中使用最为频繁的一种索引。B+树中的B代表平衡(balance),而不是二叉(binary),因为B+树是从最早的平衡二叉树演化而来的。二叉树具有以下性质:左子树的键值小于根的键值,右子树的键值大于根的键值。比如:

b934410ded82cc2d11f71f2f2ac656a4.png

对该二叉树的节点进行查找发现深度为1的节点的查找次数为1,深度为2的查找次数为2,深度为n的节点的查找次数为n,因此其平均查找次数为 (1+2+2+3+3+3) / 6 = 2.3次。但是显然对于这种:

c316cc9ea7feaf3c7a35a29a8b8c476b.png

对这种二叉树而言查询效率就要低很多,特别是查找最底层的叶子节点的时候。所以要想要这个二叉树的查询效率高,就得需要这棵二叉树尽量是平衡的。对于平衡二叉树而言,他不仅满足二叉树的性质,而且还满足任何节点的两个子树的高度最大差为1。比如:

13c35303980545efdf0def9db10825de.png

BTree是平衡搜索多叉树,是为磁盘等外存储设备设计的一种平衡查找树。系统从磁盘读取数据到内存时是以磁盘块(block)为基本单位的,位于同一个磁盘块中的数据会被一次性读取出来,而不是需要什么取什么。

InnoDB存储引擎中有页(Page)的概念,页是其磁盘管理的最小单位。Innodb默认每页大小为16k。而系统一个磁盘块的存储空间往往没有一页那么大,因此InnoDB每次申请磁盘空间时都会是若干地址连续磁盘块来达到页的大小。InnoDB在把磁盘数据读入到磁盘时会以页为基本单位,在查询数据时如果一个页中的每条数据都能有助于定位数据记录的位置,这将会减少磁盘I/O次数,提高查询效率。

BTree结构的数据可以让系统高效的找到数据所在的磁盘块。B树是一种多路自平衡搜索树,它类似普通的二叉树,但是B树允许每个节点有更多的子节点。有如下特点

所有键值分布在整个树中

任何关键字出现且只出现在一个节点中

搜索有可能在非叶子节点结束

在关键字全集内做一次查找,性能逼近二分查找算法

如下图所示为一个3阶的B-Tree

f1cb07faafd1cc9b49e67ae5d737badc.png

比如要查找位于磁盘8上的28 。从根节点开始先找到磁盘1,读入内存,通过比较关键字28找到磁盘1的指针p2。在根据p2找到磁盘3,读入内存,再通过比较关键字找到磁盘3上的指针p2.根据p2找到磁盘8读入内存,通过比较找到关键字28.由于根节点常驻内存,整个过程只是进行了2次的磁盘io操作。

B+树是在btree基础上进行的一种优化。区别如下:

B+Tree中的非叶子结点不存储数据,只存储键值;

B+Tree的叶子结点没有指针,所有键值都会出现在叶子结点上,且key存储的键值对应data数据的物理地址

结构图如下:

ba5b23e3b4fbd8e35337673028c4c2c8.png

Mysql默认innodb存储引擎就是使用B+树来实现索引结构的。由于内节点(非叶子节点)不存储data,所以一个节点可以存储更多的内节点,每个节点能索引的范围更大更精确。也就是说使用B+树单次磁盘IO的信息量相比较B树更大,IO效率更高。一般实际应用中,度d是非常大的数字,通常超过100,因此h非常小(通常不超过3,也即索引的B+树层次一般不超过三层,所以查找效率很高)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/464682.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

排序算法之简单插入法排序(Java)

简单插入排序 时间复杂度 O(n*n) 稳定的排序算法逐一取出元素,在已排好的元素序列中从后向前扫描,插入到适当的位置 部分代码如下: public static void insert_sort(int[] data){int i 0;int j 0;int len 0;int tmp 0; //局部变量if…

牛客提高R5 A.同余方程

题意 题目链接 Sol 设\(solve(x, y)\)表示\(i \in [0, x], j \in [0, y]\)满足题目要求的方案数 首先容斥一下,\(ans solve(r_1, r_2) - solve(l_1 - 1, r_2) - solve(l_2 - 1, r_1) solve(l_1 -1, l_2 - 1)\) 然后按照套路按位拆分,这里拆的时候是直接…

移植U-Boot思路和实践 | 基于RK3399

0. 背景介绍我们手里这块RK3399开发板出厂时带的是2017.09版本的U-Boot。U-Boot 2017.09 (Sep 26 2021 - 08:53:15 0000)Model: Forlinx OK3399 Evaluation Board PreSerial: 2 DRAM: 2 GiB Sysmem: init Relocation Offset is: 7dbe9000 Using default environment在这个基础…

mysql 查询 集合_MySQL使用集合函数进行查询操作实例详解

本文实例讲述了MySQL使用集合函数进行查询操作。分享给大家供大家参考,具体如下:COUNT函数SELECT COUNT(*) AS cust_num from customers;SELECT COUNT(c_email) AS email_num FROM customers;SELECT o_num, COUNT(f_id) FROM orderitems GROUP BY o_num;…

一起谈.NET技术,WPF 基础到企业应用系列5——WPF千年轮回2

一,摘要 首先很高兴这个系列能得到大家的关注和支持,前端时间身体状况不适,所以暂停了更新,对此表示非常抱歉,以后会逐渐加快进度,不过由于这是一个很长的系列,我也想把它写好,所以以…

排序算法之希尔排序(Java)

希尔排序 平均时间复杂度:O(nlogn) 不稳定的排序算法 v[0]与v[0n/2]比较,v[1]与v[1n/2]比较,v[2]与v[2n/2]比较,小的放到前面,以此类推.............. 关键部分代码如下: public static void shell_so…

AOP和IOC

AOP切面编程,作用:事务,日志,统一调用,统一实现,拦截,分发; 切点:告诉编译器切面作用于哪个package中的class IOC:控制反转,相对于new 对象来说的&#xff0c…

手把手教你|拦截系统调用

一、什么是系统调用系统调用 是内核提供给应用程序使用的功能函数,由于应用程序一般运行在 用户态,处于用户态的进程有诸多限制(如不能进行 I/O 操作),所以有些功能必须由内核代劳完成。而内核就是通过向应用层提供 系…

mysql修改列明sql语句_SqlServer修改表名、修改列名T-SQL语句

前面介绍了SQL基本用法《MSSQL数据库常见操作 SQL语句》,但是没有介绍sql修改表的相关操作,本篇文章将介绍T-SQL修改表的相关操作。1。修改表名:execute sp_rename department.mgrig ,mgrid;详述:EXEC sp_rename 表名.[原列名], 新列名, columnTransact-SQL参考sp_rename----…

求2个数的最大公约数

求2个数的最大公约数 该方法只适用于部分数 int gongyueshu(int m, int n) {if ((0 m) || (0 n)){return 0;}while (n)//考虑到n是负数{int temp n;n m % n;m temp; }return m; }

[转载]C 指针

一、认识存储单元指针是C语言最显著的特色。要理解指针的概念,需要先理解计算机读写内存的的方式以及变量的概念。计算机内存是以字节为单位划分内存单元的,每个内存单元占用一个字节,每个内存单元都有自己的地址编号,操作系统或软…

公司年会

没有抽奖的年会肯定是不完美的。有抽奖没有饭局的年会也是很香的。因为疫情,我们没有年终饭局,我也不知道过去那些年腾讯是怎么开年会的,不过今年,我觉得挺不错。上周我们搞了年终活动,我那时候还在开会,CG…

MySQL函数笔记_MySQL笔记之数学函数详解

绝对值函数ABS(x)和圆周率函数PI()复制代码 代码如下:mysql> SELECT ABS(0.5), ABS(-0.5), PI();-------------------------------| ABS(0.5) | ABS(-0.5) | PI() |-------------------------------| 0.5 | 0.5 | 3.141593 |-------------------------------…

给年薪不到48w的程序员提个醒!!

近日,一程序员在脉脉自曝“年薪37W带12人团队,因学历内推腾讯被拒”,引发争议。末流院校,带12人前端团队,到手37w股票20w,过硬的编程技术让他觉得可以出去“闯闯”;内推到腾讯,电话里…

POLYCOM RMX2000 激活与初始化 信令板卡初始化

POLYCOM RMX2000 激活与初始化 信令板卡初始化 上个星期跟组长去建行升级RMX2000的时候遇到的问题就是系统起来后,在“硬件监视器”下可以找到MPMx板卡,但是系统的“IP 网络服务”里面找不到信令板卡。 刚开始以为是板卡激活出现问题,重复了几…

实验二 网络嗅探与欺骗

实验二 中国人民公安大学 Chinese people’ public security university 网络对抗技术 实验报告 实验二 网络嗅探与欺骗 学生姓名 张昊 年级 2015 区队 三 指导教师 高见 信息技术与网络安全学院 2018年9月25日 实验任务总纲 2018—20179学年 第 一 学期 一、实验目…

年终奖

我一个人走在路上,想说点什么,我觉得很难受,去年这个时候我一个高中同学跟我聊天,他跟我说「我听说你们在深圳做程序员的工资很高,我认识的一个朋友在深圳一个月2万多,年终奖发了十几万」。我想&#xff0c…

python barrier_Python线程障碍对象Barrier原理详解

python线程Barrier俗称障碍对象,也称栅栏,也叫屏障。一.线程障碍对象Barrier简介# 导入线程模块import threading# 障碍对象barrierbarrier threading.Barrier(parties, actionNone, timeoutNone)parties — 线程计数器,记录线程数量&#x…

Spring AOP 五大通知类型

1.前置通知 在目标方法执行之前执行执行的通知。 前置通知方法,可以没有参数,也可以额外接收一个JoinPoint,Spring会自动将该对象传入,代表当前的连接点,通过该对象可以获取目标对象 和 目标方法相关的信息。 注意&…

转载CSDN博文精选:Android系列开发博客资源汇总

CSDN博客本期热文推荐,为您介绍有关Android应用开发的10个博客,分享他们的日积月累的宝贵经验,希望这些文章对Android开发者们能有所启发和帮助。 [1] 张国威:Android从入门到提高系列 前面写了十四篇关于界面的入门文章&#xff…