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,一经查实,立即删除!

相关文章

移植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在这个基础…

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

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

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

一、什么是系统调用系统调用 是内核提供给应用程序使用的功能函数,由于应用程序一般运行在 用户态,处于用户态的进程有诸多限制(如不能进行 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----…

公司年会

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

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

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

实验二 网络嗅探与欺骗

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

年终奖

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

Spring AOP 五大通知类型

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

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

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

简单工厂模式+工厂方法模式

在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的。但是在一些情况下, new操作符直接生成对象会带来一些问题。举例来说, 许多类型对象的创造需要一系列的步骤: 你可能需要计算或取得对象的初始设置; 选择生成哪个子对象实例; …

Windows下搭建ESP-IDF开发环境,适合ESP32/S2/C3/S3系列模组二次开发

前言本教程适用于以下两种用户:①无Linux环境搭建经验或搭建Linux开发环境不成功;②使用安信可windows一体化环境IDE V1.5开发环境搭建不成功;本教程提供了windows下搭建 ESP-IDF 开发环境的方法。适用系统:Windows 10 64 位版本、…

Lync Server 2010的部署系列_第六章 安装配置拓扑生成器、前端Server、前端池

一、安装 Lync Server 2010 管理工具(包括拓扑生成器) 1) 登录Front.Gianthard.com(192.168.1.21)。在“Microsoft Lync Server 2010 - 部署向导”页上,单击“安装拓扑生成器”。 2) 进行SQL方面的客户端。 3) 安装成功…

被 HR 直接怼:估计你一辈子就是个程序员

今天看到一个非常扯蛋的事情。事情来自网络,不是作者本人。我一直认为程序员是可以做一辈子的事情,程序员是一种做得越久技术越熟练的工作。但是有的人并不这样认为。---有程序员因为能力很强,公司非常满意,结果派了一位 HR 与其谈…

一起谈.NET技术,在MVC2.0使用Lodop为WEB打印提出完美解决方案

通过好友CallHot介绍Lodopweb打印控件。由于是国人开发的,故这两天认真了研究下,打算在未来的项目中使用。现将学习成果与园友分享。如果存在不足的地方,希望您指出。 具体的实现步骤如下: 一、准备工作 1.MVC2.0 jQuery1.4.1 开…

(转)python调取C/C++的dll生成方法

本文针对Windows平台下,python调取C/C的dll文件。 1.如果使用C语言,代码如下,文件名为test.c。 __declspec(dllexport) int sum(int a,int b) {return (a b); } 如果使用C语言,代码如下,文件名为test_cpp.cpp。在Wind…

生产者-消费者模式

生产者/消费者问题的多种Java实现方式 实质上,很多后台服务程序并发控制的基本原理都可以归纳为生产者/消费者模式,而这是恰恰是在本科操作系统课堂上老师反复讲解,而我们却视而不见不以为然的。在博文《一种面向作业流(工作流)的轻量级可复用…

周末,说下我喜欢的篮球

我应该有很久没有看NBA比赛了,没有其他原因,确实是因为工作太忙了,即使是在带薪上厕所,也没有足够的时间看下NBA比赛。如果说忙是一个比较好的托词,那还有一个原因,我现在更多的喜欢野球圈的新闻。刚毕业那…

没有串口,如何打印单片机调试信息?

输出调试信息是嵌入式开发中必不可少的调试利器,嵌入式开发的一个特点是很多时候没有操作系统,或者没有文件系统,常规的打印log到文件的方法基本不适用。最常用的是通过串口输出uart log,例如51单片机,只要实现串口驱动…

Linux驱动小技巧 | 利用DRIVER_ATTR实现调用内核函数

1. 前言 很多朋友在调试驱动的时候,都会遇到这样一个场景:修改一个参数,然后调用某个内核中的函数。比如将某个gpio的值拉高/拉低,修改某个寄存器的值等等。如果每一个参数都通过字符设备的ioctl接口,增加对应的cmd&am…