重新整理mysql基础篇—————索引模型[五]

你永远想象不到,一个光鲜亮丽的Application,有多么 你永远想象不到,一个光鲜亮丽的Application,有多么肮脏的Code     2022-11-30     732

关键词:

前言

简单整理一下索引模型。

正文

对我们开发人员来说,索引感觉非常的重要。

因为索引好用,但是不能多建,因为这影响插入,不能少建,因为这影响读取。

有些为了能够多建索引,通过从多个从库中读取数据,再重新整合数据来建立新的数据结构,建立新的索引。

hash 表

在索引模型中hash表非常常见,这里值的是应用内存中的索引模型,而不是数据库中的索引模型。

因为现在数据库越来越大,比较容易发生hash碰撞,形成链表,故而innodb不是用的hash这种方式。

hash索引是如何实现的在细节篇将会介绍。

hash索引可以想象成hashtable 一样,通过key-value的形式来组织结构。

同样因为是key-value 这种模式,那么出现问题的情况也很明显了。

就是key-value这种形式只能适合等值查询,不适合范围查询。

哈希表这种结构适用于只有等值查询的场景,有序数组在等值查询和范围查询场景中的性能就都非常优秀。

有序数组

有序数组不用过多的介绍吧,我们经常写的数组就是有序数组。

有序数组这种结构的索引查询效率是最高的,有序数组不仅适合等值查询同样适合范围查询的原因,在于它本来就是排好序的。

如果利用一些简单的算法,比如二分法,那么查询效率可想而知。

但是最美好的东西,往往最不适用,因为这种美好的情况,是在于只读,而不更新的角度上来讲的。

比如1到10000直接要插入一个5,那么5后面的都必须后移来给我留给位置。

有序数组索引只适用于静态存储引擎。

平衡二叉树

这种算法结构网上满大街介绍。

这里介绍一个二叉树的缺点,那就是太小,路太长。

二叉树特点就是只有一个节点只有两个节点,那么如果是100w条数据,那么就有一个比较大的问题,那么就是树太高了。

树太高有一个缺点,那就是大部分数据在叶子节点,而上面的很多判断都是低收益的判断。

还有一个缺点,那就是存储缺点,一个二叉树如何存取呢?那么可能就是每一层存储到一个数据块中,那么访问一个20层的二叉树,访问一条数据,大概率需要读取20次磁盘出来,因为数据大多数在叶子节点。

既然二叉树不行,因为太高了,能不能降低呢?可以的,可以使用n叉树来解决这个问题。

n叉树

以InnoDB的一个整数字段索引为例,这个N差不多是1200。这棵树高是4的时候,就可以存1200的3次方个值,这已经17亿了。

考虑到树根的数据块总是在内存中的,一个10亿行的表上一个整数字段的索引,查找一个值最多只需要访问3次磁盘。

其实,树的第二层也有很大概率在内存中,那么访问磁盘的平均次数就更少了。

聚簇索引和非聚簇索引的区别

主键索引也被称为聚簇索引,非主键索引也被称为二级索引。

聚簇索引就是按照每张表的主键构造一颗B+树,同时叶子节点中存放的就是整张表的行记录数据,也将聚集索引的叶子节点称为数据页。

一般建表会用一个自增主键做聚簇索引,没有的话MySQL会默认创建,但是这个主键如果更改代价较高,故建表时要考虑自增ID不能频繁update这点。

我们日常工作中,根据实际情况自行添加的索引都是辅助索引,辅助索引就是一个为了需找主键索引的二级索引,现在找到主键索引再通过主键索引找数据;

Innodb通过主键聚集数据,如果没有定义主键,innodb会选择非空的唯一索引代替。如果没有这样的索引,innodb会隐式的定义一个主键来作为聚簇索引。

聚簇索引的优缺点

  优点:

    1.数据访问更快,因为聚簇索引将索引和数据保存在同一个B+树中,因此从聚簇索引中获取数据比非聚簇索引更快

    2.聚簇索引对于主键的排序查找和范围查找速度非常快

  缺点:

    1.插入速度严重依赖于插入顺序,按照主键的顺序插入是最快的方式,否则将会出现页分裂,严重影响性能。因此,对于InnoDB表,我们一般都会定义一个自增的ID列为主键

    2.更新主键的代价很高,因为将会导致被更新的行移动。因此,对于InnoDB表,我们一般定义主键为不可更新。

    3.二级索引访问需要两次索引查找,第一次找到主键值,第二次根据主键值找到行数据。

在聚簇索引之上创建的索引称之为辅助索引,辅助索引访问数据总是需要二次查找。辅助索引叶子节点存储的不再是行的物理位置,而是主键值。通过辅助索引首先找到的是主键值,再通过主键值找到数据行的数据页,再通过数据页中的Page Directory找到数据行。

Innodb辅助索引的叶子节点并不包含行记录的全部数据,叶子节点除了包含键值外,还包含了相应行数据的聚簇索引键。

辅助索引的存在不影响数据在聚簇索引中的组织,所以一张表可以有多个辅助索引。在innodb中有时也称辅助索引为二级索引。

以上只是个人整理,如有错误,望请指点。下一节,锁。

重新整理mysql基础篇—————事务隔离级别[四]

前言简单介绍一下事务隔离的基本正文ReadUncommitted(未提交读)这个就是读未提交。就是说在事务未提交的时候,其他事务也可以读取到未提交的数据。这里举一个例子,还是前一篇的例子。假如一个张表A=500,B=300,(500,300)有一个... 查看详情

重新整理mysql基础篇—————表锁和全局锁[六](代码片段)

前言锁从大的方面可以分为:1.全局锁2.表锁3.行锁正文全局锁全局锁就是对整个数据加上读锁。在mysql中,加入全局锁的命令就是:Flushtableswithreadlock(FTWRL)这个时候会让整个数据库处于只读状态,之后其他线程的数据更新、数据定... 查看详情

mysql基础篇之索引上--04(代码片段)

Mysql基础篇之索引上--04引言索引的常见模型InnoDB的索引模型索引维护小结补充引言提到数据库索引,我想你并不陌生,在日常工作中会经常接触到。比如某一个SQL查询比较慢,分析完原因之后,你可能就会说“给... 查看详情

面向校招mysql知识点整理(代码片段)

目录基础数据库三范式InnoDB与MyISAMMySQL执行查询过程索引索引模型哈希模型有序数组模型搜索树模型BST和AVL等二叉树模型B树模型B+树主键索引和非主键索引回表索引维护(页分裂与页合并)覆盖索引最左前缀原则前缀索引索引下... 查看详情

面向校招mysql知识点整理(代码片段)

目录基础数据库三范式InnoDB与MyISAMMySQL执行查询过程索引索引模型哈希模型有序数组模型搜索树模型BST和AVL等二叉树模型B树模型B+树主键索引和非主键索引回表索引维护(页分裂与页合并)覆盖索引最左前缀原则前缀索引索引下... 查看详情

mysql基础篇之索引下--05(代码片段)

Mysql基础篇之索引下--05前言覆盖索引最左前缀原则索引下推小結前言在上一篇文章中,我和你介绍了InnoDB索引的数据结构模型,今天我们再继续聊聊跟MySQL索引有关的概念在开始这篇文章之前,我们先来看一下这个问... 查看详情

清华学长熬夜20天整理出来的“数据库mysql”基础篇小白必看!

我是二黑,一个快要秃头的测试人欢迎点赞收藏⭐留言如有错误敬请指正!我收集了一些软件测试资料,关注我公众号:程序员二黑,免费领取!最困难的时候,也就是我们离成功不远的时候!文... 查看详情

《mysql45讲》基础篇总结(代码片段)

...习笔记。根据基础篇的内容总结归纳为几部分,分类整理,并添加许多自定义的图片,看完后对MySQL的结构、日志系统、事务、索引、锁。会有新的认识。目前已有基础篇,还会持续更新…文章目录极客时间:... 查看详情

mysql重新整理——索引优化一个简单的案例[十一](代码片段)

前言经过了前面的一系列理论,那么用一个例子去看一下吧。正文EXPLAINSELECTt3.emp_no,t3.first_name,(selectt4.last_namefromtemployeest4wheret4.emp_no=t3.emp_no)ASlast_namefrom(selectt1.emp_no,t1.first_namefromtemployeest1wheret1.emp_n 查看详情

mysql基础篇--全局缓存和线程缓存

MySQL全局缓存key_buffer_size决定索引处理的速度,尤其是索引读的速度。默认值是16M,通过检查状态值Key_read_requests和Key_reads,可以知道key_buffer_size设置是否合理。比例key_reads/key_read_requests应该尽可能的低,至少是1:100,1:1000更好(... 查看详情

mysql基础篇(01):经典实用查询案例,总结整理(代码片段)

本文源码:GitHub·点这里||GitEE·点这里一、连接查询图解示意图1、建表语句部门和员工关系表:CREATETABLE`tb_dept`(`id`int(11)NOTNULLAUTO_INCREMENTCOMMENT‘主键ID‘,`deptName`varchar(30)DEFAULTNULLCOMMENT‘部门名称‘,PRIMARYKEY(`id`))ENGINE=InnoDBAUTO_INCREM... 查看详情

清华学长熬夜20天整理出来的“数据库mysql”基础篇小白必看!

...也直接决定着我们工资的上限。所以,我决定系统的整理一套MySQL的文章。希望自己总结和梳理的同时,也能帮助到大家。如下图,是MySQL系列的整体内容大纲。一、为什么要学习数据库平时我们大多数数据都是存储... 查看详情

索引-建立框架篇(代码片段)

在本篇文章中,开始部分会介绍索引的定义,及常见索引使用的数据结构和MySQL的索引模型。然后,根据索引的存储结构来学习索引的建立原则。最后会介绍索引的使用场景。在阅读后,应该了解如下的内容:索引场景的模型:... 查看详情

nginx重新整理——————反向代理[五]

前言简单整理一下反向代理。正文为什么要反向代理呢?其实这个问题也是相对来说比较好理解的。一个就是解耦,为什么这么说呢,就是将原本应用的一部分剥离出来,比如说限制流量,如果在程序中写那么相比会增加程序的... 查看详情

关于mysql,你未必知道的!

...化思路。《MyISAM与InnoDB的索引差异究竟是啥?》在上一篇基础之上,用图例讲述了My 查看详情

重新整理.netcore实践篇—————应用分层[二十四](代码片段)

前言简单整理一下分层。正文应用程序分层,分为:1.领域模型层2.基础设施层3.应用层4.共享层共享层共享层一般包括下面几个类库。有一个Core的类库,比如说BLog.Core.这个类库用来,主要用来承载一些基础简单的类型,比如说一... 查看详情

java面试之数据库篇(offer拿来吧你)(代码片段)

...秉持着"融百家之所长,汇精辟之文档"的思想,整理一下目前主流的一些八股文,以达到1+1>2的效果!文章目录基础概念1、什么是DB?DBMS?DBS?DBA?2、主键和外键有什么区别?3、数据库范式(1NF、2NF、3NF)介绍&#... 查看详情

mysql从入门到精通高级篇聚簇索引&非聚簇索引&联合索引

...您阅读本文,欢迎一键三连哦。💪🏻1.Python基础专栏,基础知识一网打尽,9.9元买不了吃亏,买不了上当。Python从入门到精通❤️2.Python爬虫专栏,系统性的学习爬虫的知识点。9.9元买不了吃亏,... 查看详情