数据库完美总结(三)

2023-05-16

索引:

数据库索引,是数据库管理系统中一个排序的数据结构,它可以对数据库表中一列或多列的值进行排序,以协助更加快速的访问数据库表中特定的数据。通俗的说,我们可以把数据库索引比做是一本书前面的目录,它能加快数据库的查询速度。【索引保存的数据结构为B+树】

索引的作用:

  • 索引所起的作用类似书籍目录,可用于快速定位、检索到数据。
  • 索引对于提高数据库的性能有很大的帮助。

若对于数据查询需求量比修改和删除需求量大的时候,简单来说只查不改可以考虑建立索引。索引也会占据额外的磁盘空间。

1)查看索引:SHOW INDEX FROM table_name;

2)创建索引:CREATE INDEX 索引名 ON  表名(字段名);

3)删除索引:DROP INDEX 索引名 ON 表名;

索引的命中:index(age,sex)

SELECT * FROM table WHERE age > 10 AND sex = 0;

会优先命中age,再命中sex,从左向右命中,不可以从右向左命中。

最左匹配原则:最左优先,以最左边的为起点任何连续的索引都能匹配上。同时遇到范围查询(>、<、between、like)就会停止匹配

使用索引

主键自动建立唯一索引。
经常作为查询条件在WHERE或者ORDER BY 语句中出现的列要建立索引。
查询中与其他表关联的字段,外键关系建立索引。
经常用于聚合函数的列要建立索引,如min(),max()等的聚合函数。

不使用索引

经常增删改的列不要建立索引。
有大量重复的列不建立索引。
表记录太少不要建立索引,因为数据较少,可能查询全部数据花费的时间比遍历索引的时间还要短,索引就可能不会产生优化效果 。


数据库引擎:传统MyISAM 和 InnoDB

传统MyISAM采用线性表存储数据,B+树存储索引,不支持事务;

InnoDB采用B+树存储索引和数据以主键作为key,支持事务;

MyISAM使用B+树作为索引结构,叶节点的data域保存的是存储数据的地址,主键索引key值唯一,辅助索引key可以重复,二者在结构上相同。 因此,MyISAM中索引检索的算法为首先按照B+Tree搜索算法搜索索引,如果要找的Key存在,则取出其data域的值,然后以data域的值为地址,去读取相应数据记录 。因此,索引文件和数据文件是分开的,从索引中检索到的是数据的地址,而不是数据。

Innodb也是用B+树作为索引结构,但具体实现方式却与MyISAM截然不同,首先,数据表本身就是按照b+树组织,所以数据文件本身就是主键索引文件。叶节点key值为数据表的主键,data域为完整的数据记录,因此InnoDB表数据文件本身就是主键索引(这也就是MyISAM可以允许没有主键,但是Innodb必须有主键的原因)。第二个与MyISAM索引的不同是InnoDB的辅助索引的data域存储相应数据记录的主键值而不是地址。换句话说,InnoDB的所有辅助索引都引用主键作为data域。


B树的搜索:从根结点开始,对结点内的关键字(有序)序列进行二分查找,如果命中则结束,否则进入查询关键字所属范围的儿子结点;重复执行这个操作,直到所对应的节点指针为空,或者已经是是叶子结点。

例如下面一个B树,那么查找元素43的过程如下:

根据根节点指针找到18、37所在节点,把此节点读入内存,进行第一次磁盘IO,此时发现43>37,找到指针p3。

根据指针p3,找到42、51所在节点,把此节点读入内存,进行第二次磁盘IO,此时发现42<43<51,找到指针p2。

根据指针p2,找到43、46所在节点,把此节点读入内存,进行第三次磁盘IO,此时我们就已经查到了元素43。

在此过程总共进行了三次磁盘IO

相对B树,B+树做索引的优势

  1. B+树的磁盘IO代价更低: B+树非叶子节点没有指向数据行的指针,所以相同的磁盘容量存储的节点数更多,相应的IO读写次数肯定减少了。

  2. B+树的查询效率更加稳定:由于所有数据都存于叶子节点。所有关键字查询的路径长度相同,每一个数据的查询效率相当。

  3. 所有的叶子节点形成了一个有序链表,更加便于查找。

关于MySQL的两种常用存储引擎MyISAM和InnoDB的索引均以B+树作为数据结构,二者却有不同(这里只说二者索引的区别)

B+Tree

B+Tree是在B-Tree基础上的一种优化,使其更适合实现外存储索引结构,InnoDB存储引擎就是用B+Tree实现其索引结构。

从上一节中的B-Tree结构图中可以看到每个节点中不仅包含数据的key值,还有data值。而每一个页的存储空间是有限的,如果data数据较大时将会导致每个节点(即一个页)能存储的key的数量很小,当存储的数据量很大时同样会导致B-Tree的深度较大,增大查询时的磁盘I/O次数,进而影响查询效率。在B+Tree中,所有数据记录节点都是按照键值大小顺序存放在同一层的叶子节点上,而非叶子节点上只存储key值信息,这样可以大大加大每个节点存储的key值数量,降低B+Tree的高度。

B+Tree相对于B-Tree有几点不同:

  1. 非叶子节点只存储键值信息。
  2. 所有叶子节点之间都有一个链指针。
  3. 数据记录都存放在叶子节点中。

将上一节中的B-Tree优化,由于B+Tree的非叶子节点只存储键值信息,假设每个磁盘块能存储4个键值及指针信息,则变成B+Tree后其结构如下图所示: 
索引

通常在B+Tree上有两个头指针,一个指向根节点,另一个指向关键字最小的叶子节点,而且所有叶子节点(即数据节点)之间是一种链式环结构。因此可以对B+Tree进行两种查找运算:一种是对于主键的范围查找和分页查找,另一种是从根节点开始,进行随机查找。

可能上面例子中只有22条数据记录,看不出B+Tree的优点,下面做一个推算:

InnoDB存储引擎中页的大小为16KB,一般表的主键类型为INT(占用4个字节)或BIGINT(占用8个字节),指针类型也一般为4或8个字节,也就是说一个页(B+Tree中的一个节点)中大概存储16KB/(8B+8B)=1K个键值(因为是估值,为方便计算,这里的K取值为〖10〗^3)。也就是说一个深度为3的B+Tree索引可以维护10^3 * 10^3 * 10^3 = 10亿 条记录。

实际情况中每个节点可能不能填充满,因此在数据库中,B+Tree的高度一般都在2~4层。mysql的InnoDB存储引擎在设计时是将根节点常驻内存的,也就是说查找某一键值的行记录时最多只需要1~3次磁盘I/O操作。

数据库中的B+Tree索引可以分为聚集索引(clustered index)和辅助索引(secondary index)。上面的B+Tree示例图在数据库中的实现即为聚集索引,聚集索引的B+Tree中的叶子节点存放的是整张表的行记录数据。辅助索引与聚集索引的区别在于辅助索引的叶子节点并不包含行记录的全部数据,而是存储相应行数据的聚集索引键,即主键。当通过辅助索引来查询数据时,InnoDB存储引擎会遍历辅助索引找到主键,然后再通过主键在聚集索引中找到完整的行记录数据。 

事务:

作为单个逻辑工作单元执行的一系列操作称为事务。

其四大特性ACID:

原子性(Atomicity)执行指令时,要么全部执行成功,要么全部失败。只要其中一个指令执行失败,所有的指令都执行失败。

一致性(Consistency)事务的执行使数据从一个状态转换为另一个状态,但是对于整个数据的完整性保持稳定。

隔离性(Isolation)当出现并发访问时,数据库为每个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间是相互隔离的。 即要达到这么一种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,每个事务都感觉不到有其他事务在并发地执行。

持久性(Durability)当事务正确完成后,它对于数据的改变是永久性的。

事务的使用: 

开启事务:      start transaction;
                    ……执行SQL语句……
回滚或提交:   rollback/commit;
说明:rollback即是全部失败,commit即是全部成功

  • SET AUTOCOMMIT=0     禁止自动提交
  • SET AUTOCOMMIT=1     开启自动提交

并发事务导致的问题:

在许多事务去处理同一个数据时,如果没有采取有效的隔离机制,就会带来一些的问题。

  ● 丢失更新:撤销一个事务时,把其他事务已提交的更新数据覆盖。

【例如:小明去银行柜台存钱,他的账户里原来的余额为100元,现在打算存入100元。在他存钱的过程中,银行年费扣了5元,余额只剩95元。突然他又想着这100元要用来请女朋友看电影吃饭,不打算存了。在他撤回存钱操作后,余额依然为他存钱之前的100元。所以那5块钱到底扣了谁的?】

       ● 脏读:有一行数据刚更新,与此同时另一个查询读到了这个刚更新的值。这样就导致了脏读,因为更新的数据还没有进行持久化,更新这行数据的业务可能还会进行回滚操作。

【例如:小明的银行卡余额里有100元。现在他打算用手机点一个奶茶,需要付款10元。但是这个时候,他的女朋友看中了一件衣服95元,她也正在使用小明的银行卡付款。于是小明在付款的时候,程序后台读取到他的余额只有5块钱了,根本不够10元,所以系统拒绝了他的交易,告诉余额不足。但是小明的女朋友最后因为密码错误,无法进行交易。小明非常郁闷,明明银行卡里还有100元,怎么会余额不足呢?】

      ● 幻读也叫虚读:一个事务执行多次查询,第二次结果集包含第一次中没有或已经被删除的数据,造成两次结果不一致,只是另一个事务在这两次查询中间插入或删除了数据造成的。幻读是事务非独立执行时发生的一种现象。

【例如:事务T1对一个表中所有的行的某个数据项做了从“1”修改为“2”的操作,这时事务T2又对这个表中插入了一行数据项,而这个数据项的数值还是为“1”并且提交给数据库。而操作事务T1的用户如果再查看刚刚修改的数据,会发现还有一行没有修改,其实这行是从事务T2中添加的,就好像产生幻觉一样,这就是发生了幻读。】

      ● 不可重复读:一个事务两次读取同一行的数据,结果得到不同状态的结果,中间正好另一个事务更新了该数据,两次结果相异,不可被信任。

【例如:事务T1在读取某一数据,而事务T2立马修改了这个数据并且提交给数据库,事务T1再次读取该数据就得到了不同的结果。】

Tips:不可重复读和脏读的区别:脏读是某一事务读取了另一个事务未提交的脏数据,而不可重复读则是读取了前一事务提交的数据。 

Tips:幻读和不可重复读都是读取了另一条已经提交的事务,所不同的是不可重复读查询的都是同一个数据项,而幻读针对的是一批数据整体(比如数据的个数)。


数据库事务的隔离级别:

事务的隔离级别有4种,由低到高分别为Read uncommitted 、Read committed 、Repeatable read 、Serializable

1.Read uncommitted(最低级别,任何情况都无法保证)

顾名思义:读未提交,就是一个事务可以读取另一个未提交事务的数据。 产生脏读

2.Read committed(可避免脏读的发生)

顾名思义:读提交,就是一个事务要等另一个事务提交后才能读取数据。产生不可重复读

若有事务对数据进行修改(UPDATE)操作时,读操作事务要等待这个更新操作的事务提交后才能读取数据,可以解决脏读问题。但假如有一个事务做了两次查询却返回了不同数据,这就是不可重复读。

3.Repeatable read(可避免脏读、不可重复读的发生)

顾名思义:重复读,就是在开始读取数据(事务开启)时,不再允许修改操作。产生幻读(看到修改,但是结果没变)

不可重复读对应的是修改(UPDATE)操作。但是可能还会有幻读问题。因为幻读问题对应的是插入(INSERT)操作。

4.Serializable(可避免脏读、不可重复读、幻读的发生) 。但是效率最低

顾名思义:序列化 Serializable 是最高的事务隔离级别,在该级别下,事务串行化顺序执行,可以避免脏读、不可重复读与幻读。但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。

Tips:大多数数据库默认的事务隔离级别是Read committed,比如SQL Server , Oracle。

   MySQL的默认隔离级别是Repeatable read。

注意:隔离级别的设置只对当前链接有效,一定要是在开启事务之前就设置数据库的隔离级别。


SQL语句优化:

怎么判断sql查询慢呢?
    1、使用explain进行分析sql 查询当前sql索引使用程度,是否需要建立索引。
    2、检查sql是否多表联查时,是否是小表驱动大表。
    3、慎用group by +  order by 操作,使用FORCE INDEX(XXX) 强制索引,进行查询。
    4、检查yml文件,看一下服务器环境连接地址是否是内网IP,不是公网IP。
    5、检查mysql内存分配,使用show variables like 'innodb_buffer_pool%';进行查询内存。

1.如果数据量很大,并且查询多余修改的话,可以考虑建索引,但是索引也是占磁盘空间的;

2.WHERE句子中:可以过滤掉大量数据的条件写在WHERE子句末尾或HAVING末尾;

3.避免在索引列上使用IS NULL或者IS NOT NULL;

4.尽量避免在WHERE子句中对字段进行NULL判断和表达式操作,会导致引擎放弃索引而使用全表扫描。

大表如何优化? ***

  • 限定数据的范围:避免不带任何限制数据范围条件的查询语句。
  • 读写分离:主库负责写,从库负责读。
  • 垂直分表:将一个表按照字段分成多个表,每个表存储其中一部分字段。
  • 水平分表:在同一个数据库内,把一个表的数据按照一定规则拆分到多个表中。
  • 对单表进行优化:对表中的字段、索引、查询SQL进行优化。
  • 添加缓存

什么是垂直分表、垂直分库、水平分表、水平分库? ***

垂直分表:将一个表按照字段分成多个表,每个表存储其中一部分字段。一般会将常用的字段放到一个表中,将不常用的字段放到另一个表中。

垂直分表的优势:

  • 避免IO竞争减少锁表的概率。因为大的字段效率更低,第一数据量大,需要的读取时间长。第二,大字段占用的空间更大,单页内存储的行数变少,会使得IO操作增多。
  • 可以更好地提升热门数据的查询效率。

垂直分库:按照业务对表进行分类,部署到不同的数据库上面,不同的数据库可以放到不同的服务器上面。

垂直分库的优势:

  • 降低业务中的耦合,方便对不同的业务进行分级管理。
  • 可以提升IO、数据库连接数、解决单机硬件资源的瓶颈问题。

垂直拆分(分库、分表)的缺点:

  • 主键出现冗余,需要管理冗余列
  • 事务的处理变得复杂
  • 仍然存在单表数据量过大的问题

水平分表:在同一个数据库内,把同一个表的数据按照一定规则拆分到多个表中。

水平分表的优势:

  • 解决了单表数据量过大的问题
  • 避免IO竞争并减少锁表的概率

水平分库:把同一个表的数据按照一定规则拆分到不同的数据库中,不同的数据库可以放到不同的服务器上。

水平分库的优势:

  • 解决了单库大数据量的瓶颈问题
  • IO冲突减少,锁的竞争减少,某个数据库出现问题不影响其他数据库(可用性),提高了系统的稳定性和可用性

水平拆分(分表、分库)的缺点:

  • 分片事务一致性难以解决
  • 跨节点JOIN性能差,逻辑会变得复杂
  • 数据扩展难度大,不易维护

在系统设计时应根据业务耦合来确定垂直分库和垂直分表的方案,在数据访问压力不是特别大时应考虑缓存、读写分离等方法,若数据量很大,或持续增长可考虑水平分库分表,水平拆分所涉及的逻辑比较复杂,常见的方案有客户端架构和恶代理架构。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据库完美总结(三) 的相关文章

  • API调用次数限制实现

    API调用次数限制实现 在开发接口服务器的过程中 xff0c 为了防止客户端对于接口的滥用 xff0c 保护服务器的资源 xff0c 通常来说我们会对于服务器上的各种接口进行调用次数的限制 比如对于某个 用户 xff0c 他在一个时间段 x
  • SVN 问题Cannot load supported formats: Cannot run program "svn": CreateProcess error=2, ϵͳÕҲ»µ½ָ¶

    AndroidStudio SVN问题解决 今天在尝试使用Android Studio的SVN得时候出现 Cannot load supported formats Cannot run program svn CreateProcess
  • 你是哪个级别?(工程师级别划分)

    工程师的划分 初级工程师 xff08 实习生 xff09 中级工程师 xff08 普通员工 xff0c 小组长 xff09 高级工程师 xff08 CTO 技术研发领头人 xff09 初级工程师 和入门级别基本上可以等同 xff0c 他们一
  • Python Koans(1)-assert

    span class hljs comment usr bin env python span span class hljs comment coding utf 8 span span class hljs keyword from s
  • [初学Python]学习如何编写GUI界面(初级)

    sublime 这个文本编辑器好像就是用python写的 所以一直也挺好奇如何利用Pycharm编写有界面的python应用 言归正传 xff0c Python界面程序编写主要依靠一个库叫做Tkinter 下载Tkinter 我使用的是Ub
  • Youtube 视频自动播放

    最近在做一项目的时候 xff0c 需要播放Youtube视频 播放方式大体有三种 1 WebView xff08 我最终用的 xff09 2 Youtube SDK xff08 需要谷歌开发者账户 xff09 3 VideoView 其他两
  • Clion的激活方法

    弹出注册窗口选择Activate License Server 输入 http xidea online xff0c 然后点击 Activate 完成认证即可
  • CocosCreator学习1-按钮点击

    Cocos Creator小白学习 实现button点击事件 关于cocos creator 本人就是小白一个 xff0c 什么都不会 xff0c 只能慢慢从头开始摸索着来 xff0c 自己也希望能够在写自己的学习过程中 xff0c 能够给
  • 多传感器融合中的时间同步2-论文阅读

    文章目录 前言主要内容pps对于INS时间戳校准作用原理 测试结果参考文献 前言 阅读硕士论文 GPS INS组合导航系统研究及实现 xff0c 该论文第5章为时间同步系统设计 xff0c 为GPS INS系统设计的时间同步系统部分内容非常
  • GUI读取图片和变换图片

    GUI读取图片和变换图片 这个程序的主要功能是一个按钮读取图片 xff0c 另一个用来对图片进行变换的 xff0c 过程很简单 GUI中的varargout函数将句柄handles保存的hObject输出 xff0c hObject是当前回
  • Java泛型--泛型应用--泛型接口、泛型方法、泛型数组、泛型嵌套

    1 泛型接口 1 1泛型接口的基本概念 1 2泛型接口实现的两种方式 定义子类 xff1a 在子类的定义上也声明泛型类型 interface Info lt T gt 在接口上定义泛型 public T getVar 定义抽象方法 xff0
  • SLA的基本概念

    SLA的基本概念 现在的产品和系统都非常的复杂 xff0c 彼此连接依赖越来越复杂 xff0c 为了整体的高速运转 xff0c 对每个部件的稳定性越来越高 xff0c 越来越精密 xff0c 发展到一定程度 xff0c 人力已经无法掌控 x
  • Linux下调试段错误的方法[Segmentation Fault]--GDB

    原文 1 段错误是什么 xff1f 段错误是指访问的内存超出了系统给这个程序所设定的内存空间 xff0c 例如访问了不存在的内存地址 访问了系统保护的内存地址 访问了只读的内存地址等等情况 A segmentation fault ofte
  • linux驱动开发--copy_to_user 、copy_from_user函数实现内核空间数据与用户空间数据的相互访问

    设备读操作 如果该操作为空 xff0c 将使得read系统调用返回负EINVAL失败 xff0c 正常返回实际读取的字节数 ssize t read struct file filp char user buf size t count l
  • 函数中的形式参数和实际参数

    1 举例 xff1a 使用函数交换两个整形变量的值 运行结果 xff1a 分析 xff1a c语言中实际参数和形式参数之间采用值传递的方式来传递数据 在被调函数中 xff0c 使用的是实际参数的一个拷贝数据 我们在swap函数中交换了a和b
  • Linux 线程挂起与唤醒功能 实例

    pthread cond wait 多线程的条件变量 条件变量是利用线程间共享的 全局变量进行同步的一种机制 xff0c 主要包括两个动作 xff1a 一个线程等待 34 条件变量的条件成立 34 而挂起 xff1b 另一个线程使 34 条
  • Linux下socket编程,附带tcp例子

    1 网络中进程之间如何通信 xff1f 本地的进程间通信 xff08 IPC xff09 有很多种方式 xff0c 但可以总结为下面4类 xff1a 消息传递 xff08 管道 FIFO 消息队列 xff09 同步 xff08 互斥量 条件
  • 程序员加班到深夜,你经历过没?

    我看到了自己的影子啊 虽然自己非科班出身 xff0c 学历也不高吧 xff0c 但是自认为还是很努力的 xff0c 但是为什么现在的工资水平却跟应届生差不多呢 xff1f xff08 xff09 仔细想想 xff0c 自己毕业3年了 xff
  • 【C/C++学院】(16)QT版:幸运大抽奖

    程序效果 xff1a ifndef DIALOG H define DIALOG H include lt QDialog gt include lt QLabel gt include lt QPushButton gt include

随机推荐

  • 【Python基础】--Pickle/函数默认参数/函数的参数*args/Bytes<=>str/32-64bit/bytes对象

    Pickle gt gt gt import pickle gt gt gt my list 61 1 2 3 39 haha 39 39 and 39 39 or 39 gt gt gt pickle file 61 open 39 my
  • Windows平台python操作串口示例,可以加工下,改写成方便的测试软件

    在 windows中 xff0c 使用 Python 进行串口编程需要安装一个 Serial 模块 pyserial xff1a 下载地址 https pypi python org pypi pyserial下载完成后得到一个 pyser
  • 告别csdn一年了

    原本坚持了4年的学习 xff0c 整理笔记 xff0c 在csdn平台上进行发表 xff0c 记录 同朋友们互动 xff0c 探讨进行学习 xff0c 自己也在不断地成长 今天再次进入博客页面 xff0c 发现界面来了个大改版 xff0c
  • KVM虚拟机创建功能详细讲解

    KVM虚拟机创建功能详细讲解 一 KVM虚拟机创建的用户操作 对于用户或者管理员来说 xff0c 虚拟机的创建有着很多的方法 xff0c 例如 xff1a kvm自带命令行工 具 使用virsh命令来创建 使用具有图形界面的virt man
  • php视频课程

    php视频课程 xff1a 下载地址 xff1a http php itcast cn php video shtml 注 xff1a 此系列视频 xff0c 韩顺平主讲 1 php入门到精通教程 2 第二版mysql视频教程 进行中 3
  • 2014年计算机求职总结--面试篇

    又一年实习招聘陆续开始了 xff0c 这里分享一下我在2013年实习招聘和秋季招聘中的一些面试经历 xff0c 希望能对找工作的同学有所帮助 2013年面试过的公司有蘑菇街 网易游戏 阿里巴巴 腾讯 百度 大众点评 人人网 雅虎 xff08
  • 用位运算实现两个整数的加减乘除运算

    位运算的思想可以应用到很多地方 xff0c 这里简单的总结一下用位运算来实现整数的四则运算 1 整数加法 int Add int a int b for int i 61 1 i i lt lt 61 1 if b amp i for in
  • 深入理解C/C++数组和指针

    版权所有 xff0c 转载请注明出处 xff0c 谢谢 xff01 http blog csdn net walkinginthewind article details 7044380 C语言中数组和指针是一种很特别的关系 xff0c 首
  • 轻松搞定面试中的链表题目

    版权所有 xff0c 转载请注明出处 xff0c 谢谢 xff01 http blog csdn net walkinginthewind article details 7393134 链表是最基本的数据结构 xff0c 面试官也常常用链
  • 轻松搞定面试中的二叉树题目

    版权所有 xff0c 转载请注明出处 xff0c 谢谢 xff01 http blog csdn net walkinginthewind article details 7518888 树是一种比较重要的数据结构 xff0c 尤其是二叉树
  • 动态内存分配(malloc/free)简单实现--隐式空闲链表

    本文使用隐式空闲链表实现简单的动态内存分配 动态内存分配器维护一个大块区域 xff0c 也就是堆 xff0c 处理动态的内存分配请求 分配器将堆视为一组不同大小的块的集合来维护 xff0c 每个块要么是已分配的 xff0c 要么是空闲的 实
  • 二分查找,你真的掌握了吗?

    版权所有 xff0c 转载请注明出处 xff0c 谢谢 xff01 http blog csdn net walkinginthewind article details 8937978 二分查找 xff0c 最基本的算法之一 xff0c
  • 【谷歌面试题】求数组中两个元素的最小距离

    一个数组 xff0c 含有重复元素 xff0c 给出两个数num1和num2 xff0c 求这两个数字在数组中出现的位置的最小距离 O n 时间复杂度 xff0c O 1 空间复杂度 int minDistance int A int si
  • 进程间通信

    原作者地址不详 摘 要 随着人们对应用程序的要求越来越高 xff0c 单进程应用在许多场合已不能满足人们的要求 编写多进程 多线程程序成为现代程序设计的一个重要特点 xff0c 在多进程程序设计中 xff0c 进程间的通信是不可避免的 Mi
  • 关于CPU C-States 省电模式,你需要知道的事情

    为了在CPU空闲的时候降低功耗 xff0c CPU可以被命令进入low power模式 每个CPU都有几种power模式 xff0c 这些模式被统称为C states或者C modes lower power模式最早在486DX4处理器上被
  • 一次由于设置错误,导致无法进入gnome的解决。

    我的系统是lenny 今天 xff0c 在 系统 gt 首选项 gt 音效 中修改了一处设置 xff0c 导致当前账号不能进入gnome 设置的图片如下 xff1a 我选中了 允许软件混音 和 播放系统声音 这两项 xff0c 结果当时系统
  • 分享一下工作以来我看过计算机书籍

    由于自工作依赖一直专注于linux 下的c c 43 43 编程工作 xff0c 所以 xff0c 我的书籍也大的都是这方 这边书尽管很经典 xff0c 但是我的能力实在有限 xff0c 只把数据结构的那点看了一下 xff0c 其他的 看的
  • strlen三种不同的写法

    strlen用来表示字符串的长度 区别于用关键字sizeof 计算字节大小 strlen有三种写法 1 采用常规的count计数法 int my strlen const char str char p 61 char str int co
  • 面试常见链表题总结(如果失眠了就拿出来看看)

    无头单链表 现场手撕代码 43 分析 xff0c 供自己闲时手机复习使用 xff01 删除链表中等于给定值 val 的所有节点 反转一个单链表 给定一个带有头结点 head 的非空单链表 xff0c 返回链表的中间结点 如果有两个中间结点
  • 数据库完美总结(三)

    索引 xff1a 数据库索引 xff0c 是数据库管理系统中一个排序的数据结构 xff0c 它可以对数据库表中一列或多列的值进行排序 xff0c 以协助更加快速的访问数据库表中特定的数据 通俗的说 xff0c 我们可以把数据库索引比做是一本