eIT.com.cn 2022/12/6 7:56:56 阅读 53 次
作者:敲の流川枫 主页:流川枫的 专栏:和我一起学java 语录:Stay hungry stay foolish 给大家推荐一款好用的神器 目录
1.索引的本质索引的本质就相当于"书的目录",通过目录就能定位到我们需要的某个章节的位置 索引的主要作用就是为了加快查找的速度 在操作中,的频率是非常高的,使用索引可以帮助我们查找到所需要的信息 缺点 1.索引提高速度的同时也了操作的开销,进行增删改操作之后,调整数据之后还要索引,因此了其他开销,但是这是次要矛盾,主要矛盾是的速度,相比之下还是很值得的 2.不仅如此,索引还提高了空开销,构造索引需要额外的硬盘空间来保存 虽然有这些缺点,但是他能我们的主要矛盾,在软件开发中会经常遇到这样的问题.一般的都没有那个能所有问题,需要进行取舍,主要矛盾 2.索引的使用2.1查看索引 如果表里有主键,主键这列就会创建索引
还有unique,foreign key 的列也会创建索引 2.2创建索引
此时就有两个索引,针对name新加了索引 在创建索引的时候,最好是在表创建的时候就把索引创建好,否则,如果这个表的记录十分多了,再创建索引,就很危险了!!是因为此时创建索引会花很长的时间,占用了大量的的磁盘IO,此时是无法对进行访问的的,也无法正常使用,那带来的损失就太大了 2.3索引 此时只剩索引了,和刚刚创建索引相似的是,索引也会有较大的开销,所以在创建表的时候我们就要规划好索引,一旦表里有大量的数据了,再进行操作就需要慎重考虑了!! 那么创建好了索引,是怎么使用索引的呢? 创建好索引之后,是不需要手动的的,是通过的执行引擎来执行的,涉及到一些优化操作,执行引擎会评估哪种方案成本最低速度最快,可以使用explain关键字出过程中索引的具体使用情况,结果分析还是比较复杂的 3.索引的数据结构中索引的数据结构是什么呢? 索引既然能极大提高的效率,我们肯定能先想到的数据结构就是哈希表,哈希表的时间复杂度是O(1),但是哈希表不适合做的索引,原因在于哈希表只能比较相等,无法进行范围,像<>这样的操作都不行 3.1B树其次,二叉树元素的时间复杂度是O(N),相比于哈希表,二叉树好像可以进行范围了,但是还存在问题,当元素数太多时,树的高度就会比较高,而数的高度又决定了树的时候比较的,比较的时候需要读取硬盘,因此更希望书的高度能降低一点,那么就考虑使用N叉树了 N叉树,每个节点有很多个值,同时有很多的分叉,降低了树的高度,减少了比较的 一种典型的实现N叉树的方式就是B树 我们看一下B树的结构
这种结构降低了树的高度,没有减少比较(但是在节点上比较多次了),减少了对硬盘的读写,节点都是保存在硬盘上的,能一定程度的问题,适合做索引 3.2B+树还有种更适合做索引的数据结构,就是B+树
B+树的特点: 1.B+树也是N叉树,了新的特点,每个节点上包含N个Key,N个Key划分出N个区间,每个区最后key就是最大值 2.父元素的Key会在子元素中出现并且为最大值,重复出现导致了,叶子节点就包含了所有数据的全集! 那么非叶子结点的所有元素都在叶子节点中体现 3.叶子节点用类似于链表的形式相连起来,构成了B+树 B+树这个数据结构做索引好处太明显了 1.既有B树高度比较低的特点,又更适合范围,比如查找>6且<15的元素,结果集非常容易取得,效率很高 2.对于所有的,都要落在叶子节点上,中比较是差不多的,操作比较均衡 对B树来说,在根节点或者深度不深的元素快,别的地方慢,不均衡,B+树都是一样的,都落在叶子节点上了 3.由于所有的Key都会在叶子节点中出现,因此非叶子节点不用存表的真实记录,只要把说有的数据行放在叶子节点上即可,非叶子节点只用存索引列的值,比如id这些,非叶子节点占用的空间就很小了,有可能在内存中放进去缓存了,更进一步降低了硬盘IO,提高了的速度 综上,B+树是非常适合作为索引的数据结构的 有的表不只是有主键索引,还有别的非主键列也有索引,此时会构造另B+树,非叶子节点里面存储这一列的Key,到了叶子节点这一层不再存储完整的数据行了,而是存储主键索引的id,那么使用主键索引时只用查一次B+树就好了,使用非主键列索引要先查一遍另外构造的B+树,然后查一次主键列的B+树(这个操作称为回表操作) 当前B+树这个结构适用于的InnoDB这个数据引擎,不同的,不同的引擎存储数据的数据结构还是有差异的 4.事务事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败。在不同的环境中,都可以有事务。对应在中,就是事务。 4.1 事物的回滚(rollback)当事务在执行时,执行中间出错了,就让它恢复成原来的样子 涉及到的操作就是回滚,具体实现是把执行过的操作逆向恢复回去 会把执行的每个操作都记录下来,如果某个操作出错了,就会把事务中之前的操作进行回滚,根据之前的操作,进行逆操作(前面插入回滚就是之前插入的) 有了这个操作,那么删表删库是不是就不危险了呢?反正可以回滚么,事实当然不是这样的,回滚的操作是有很大开销的,可以保执行的操作,但也不能无限保存,最多就是保存正在执行的事务,当数据量特别大时,更不可能保存每个数据如何得到,因此删表删库仍然是很危险的操作!! 4.2事务的四大特性(ACID)事务的四大特性主要是:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability) 4.2.1 原子性原子性是指事务是不可分割的工作单位,事务中的操作要么全部成功,要么全部失败。比如在同事务中的语句,要么全部执行成功,要么全部执行失败 4.2.2 一致性事务必须使从一致性状态变换到另外一致性状态,事物的执行前后数据是合法的 比如银行转账时,A给B转了100,A转出100,B却没有收到100,这时就出现了数据不合法,没有达到一致性 4.2.3 持久性持久性是指事务一旦被提交,它对中数据的改变就是永久性的,接下来即使发生故障也不应该对其有任何影响,保证事务对的改变是生效的 4.2.4 隔离性服务器同时执行多个事务的时候,事物之相互影响的程度 隔离性越高,事务之间并发程度越低,执行效率慢,但是数据准确性高,像银行转账..... 隔离性越低,事务之间并发程度越高,执行效率快,但是数据准确性低,像点赞数..... 5.并发引起的问题5.1 "读脏数据"当事务某个数据后,另一事务对该数据进行了读取,由于某种原因前一事务撤销了对数据的(即将过的数据恢复原值),那么后一事务读到的数据与中的数据不一致,这称之为读脏数据 为了这个问题,要降低并发性,提高隔离性,具体操作就是给''写操作''加锁,写的时候不能被读取,降低了一定的效率,但是提高了数据的准确性 5.2 "不可重复读"当事务读取某个数据后,另一事务执行了对该数据的更新,当前事务再次读取该数据(希望与第一次读取的是相同的值)时,得到的数据与前一次的不一样,这是由于第一次读取数据后,事务B对其做了,导致再次读取数据时与第一次读取的数据不相同 这次给''读操作''加锁,读的时候数据不能被,并发程度进一步降低,隔离性进一步,运行速度变慢,数据准确性进一步提高了 5.3 "幻读"事务A 按照一定条件进行数据读取, 期间事务B 插入了相同条件的新数据,事务A再次按照原先条件进行读取时,发现了事务B 为了这个问题,需要彻底舍弃并发,进行串行化操作,在读的时候不进行其他的操作 6.的隔离级别为了控制并发程度的高低,引入了四个隔离级别,通过就可以改变隔离级别 6.1 read uncommitted不做任何处理,事务间随意并发,当然上面的三个问题都存在,隔离性最低,并发程度最高 6.2 read committed对写操作加锁,了读脏数据问题,还存在另外两个问题 6.3 repeatable read对读写操作加锁,不可重复读问题 还存在幻读问题 6.4 serializable严格串行化,了三个由并发引起的问题,并发程度最低,隔离性是最高的 看这张图比较直观
总结以上是为你收集整理的全部内容。 如果觉得网站内容还不错,欢迎将推荐给好友。 原文地址:https://blog.csdn.net/chenchenchencl |
• MySQL的索引与事务 (2022/12/6 7:56:56)
• 【MySQL】MVCC原理分析 + 源码解读 -- 必须说透 (2022/12/6 7:56:55)
• CDH大数据平台 29Cloudera Manager Console之superset之MySQL元数据配置(markdown新版三) (2022/11/29 12:05:25)
• mysql 锁机制与原理详解 (2022/11/28 16:05:02)
• [MSSQL]汉字转拼音函数实现语句 (2022/11/26 6:11:29)
• 采用 Kettle 分页处理大数据量抽取任务 (2022/11/24 14:52:15)
• Oracle Flashback 和 RMAN 示例 (2022/11/24 14:52:15)
• MySQL 的安装和配置 (2022/11/24 14:52:15)
• NFT是什么?一篇文章搞懂NFT的概念 (2022/11/23 18:08:16)
• [MySQL]复杂查询(进阶) (2022/11/23 9:22:28)
电脑入门资料 | XSD | 其它IT认证 | Cisco 交换基础 | 游戏开发 | 木马病毒 | HCatalog | 电脑CPU | VC.Net | 大数据分析 | Grav | Angular 2 | 中间件 | 局域网共享 | QlikView | TestRail | 软件水平考试 | DJANGO | iBATIS | Word
合作媒体与友情链接 |
生活常识小贴士 | 软件开发教程 | 智慧城市生活网 | 息县通生活服务[移动版] | 息县商圈[移动版] | 美食菜谱 |
健康养生 | 法律知识 | 科技频道 | 电影影讯 | 留学考研学习 | 星座生肖|解梦说梦 |
关于我们 | 联系我们 | 合作媒体 | 使用条款 | 隐私权声明 | 版权声明 |
Copyright © 2023 eIT.com.cn. All Rights Reserved. | 豫ICP备2022012332号 |