![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
MySQL数据库
文章平均质量分 73
最常见的 MySQL数据库面试题,带你三分钟搞懂,面试再也不虚。
喵呜刷题
使用 Vx [喵呜刷题],来来来,我们一起组队刷题!
展开
-
MySQL索引的类型有哪些?
B*tree索引的话通常在访问小数据量的情况下比较适用,比如你访问不超过表中数据的5%,当然这只是个相对的比率,适用于一般的情况。bitmap的话在数据仓库中使用较多,用于低基数列,比如性别之类重复值很多的字段,基数越小越好。如有好的面试知识或技巧期待您的共享!一站式解决面试问题,你可以搜索微信小程序。说说数据库索引类型?原创 2023-09-06 08:48:30 · 649 阅读 · 0 评论 -
MySQL 中 MyISAM 与 InnoDB 引擎的区别
即MyISAM同一个表上的读锁和写锁是互斥的,MyISAM并发读写时如果等待队列中既有读请求又有写请求,默认写请求的优先级高,即使读请求先到,所以MyISAM不适合于有大量查询和修改并存的情况,那样查询进程会长时间阻塞。MyISAM:只支持表级锁,用户在操作myisam表时,select,update,delete,insert语句都会给表自动加锁,如果加锁以后的表满足insert并发的情况下,可以在表的尾部插入新的数据。MyISAM:如果执行大量的SELECT,MyISAM是更好的选择。原创 2023-09-06 08:47:43 · 847 阅读 · 0 评论 -
说说什么是间隙锁
在RR隔离级别下:快照读有可能读到数据的历史版本,也有可能读到数据的当前版本。所以快照读无需用锁也不会发生幻读的情况。间隙锁为了解决RR(可重复读)级别下当前读导致的幻读问题,锁的对象是索引叶子节点的next指针。叶子节点3及之后所有节点会加行锁并且他们的next指针会加锁,间隙锁会退化为行锁只锁叶子节点3 ,为什么因为没必要。会发生锁表,因为c没有索引结构能存储行锁或者间隙锁。如有好的面试知识或技巧期待您的共享!会锁住主键索引叶子节点的3的next指针。一站式解决面试问题,你可以搜索微信小程序。原创 2023-09-05 07:14:06 · 568 阅读 · 0 评论 -
InnoDB为什么使用B+Tree
因此 B+ Tree的关键又是在于中间节点不包含数据,因此B+Tree的大小远小于B Tree,并且可以将更多的数据存储到磁盘中(反之,存储到叶节点的索引键值也就更多)B+ Tree和B Tree不同,B+Tree中,只能将数据存储在叶子节点中,内部节点只包含指向下一节点的指针,而B Tree可以将数据存储在内部的叶节点中;B类树的一个很鲜明的特点就是数的层数比较少,而每层的节点非常多,树的每个叶子节点到根节点的距离都是相同的;如有好的面试知识或技巧期待您的共享!一站式解决面试问题,你可以搜索微信小程序。原创 2023-09-05 07:13:08 · 806 阅读 · 0 评论 -
InnoDB全文索引是如何实现的?
记录的是已经被删除索引记录并真正从FTS Index Cache删除的FTS_DOC_ID(即删除FTS Index Cache并做了OPTIMIZE TABLE),后者是前者的内存缓存。Document存储的是键值对,键为FTS_DOC_ID,值为在文档中的位置,对应于ilist。包含全文索引的内部信息,最重要的存储是FTS_SYNCED_DOC_ID,表示已经解析并刷到磁盘的FTS_DOC_ID, 在系统宕机时,可以根据这个值判断哪些该重新分词并加入到FTS Index Cache中。原创 2023-09-05 07:09:42 · 405 阅读 · 0 评论 -
说说复合索引之最左前缀原理?
若没有按照索引顺序时,mysql查询优化器会自动的调整顺序来使用定义好的索引,如果我们将where中的条件顺序颠倒效果是一样的。对于范围条件查询,MYSQL无法再使用范围后面的其他索引列了。但对多个等值条件查询则没有这样的限制。如果查询条件中含有函数或表达式,则MySQL不会为这列使用索引(虽然某些在数学意义上可以使用)。MySQL中的索引可以以一定顺序引用多个列,这种索引叫做复合(联合)索引。此时可以用到索引,如果通配符%不出现在开头,则可以用到索引。由于不是最左前缀,索引这样的查询显然用不到索引。原创 2023-09-05 07:09:21 · 412 阅读 · 0 评论 -
为什么要建前缀索引?
相反情况下不适合使用前缀索引,比如,整个字段的长度为 20,索引选择性为 0.9,而我们对前 10 个字符建立前缀索引其选择性也只有 0.5,那么我们需要继续加大前缀字符的长度,但是这个时候前缀索引的优势已经不明显,就没有创建前缀索引的必要了。有一种与索引选择性有关的索引优化策略叫做前缀索引,就是用列的前缀代替整个列作为索引key,当前缀长度合适时,可以做到既使得前缀索引的选择性接近全列索引,同时因为索引key变短而减少了索引文件的大小和维护开销。如有好的面试知识或技巧期待您的共享!原创 2023-09-05 07:09:03 · 484 阅读 · 0 评论 -
如何创建合理的索引,索引如何优化?
如果已经删除了表的一大部分,或者如果已经对含有可变长度行的表进行了很多的改动,则需要做定期优化。这个命令可以将表中的空间碎片进行合并,但是此命令只对MyISAM、BDB和InnoDB表起作用。如果索引正在工作,Handler_read_key的值将很高,这个值代表了一个行被索引值读的次数。Handler_read_rnd_next的值高则意味着查询运行低效,并且应该建立索引补救。通过explain 关键字分析效率低的SQL执行计划。如有好的面试知识或技巧期待您的共享!原创 2023-09-05 07:09:46 · 256 阅读 · 0 评论 -
说说MySQL回表查询与覆盖索引
通俗的讲就是,如果索引的列在 select 所需获得的列中(因为在 mysql 中索引是根据索引列的值进行排序的,所以索引节点中存在该列中的部分值)或者根据一次索引查询就能获得记录就不需要回表,如果 select 所需获得列中有大量的非索引列,索引就需要到表中找到相应的列的信息,这就叫回表。先通过普通索引定位到主键值id=5;在通过聚集索引定位到行记录;这就是所谓的回表查询,先定位主键值,再定位行记录,它的性能较扫一遍索引树更低。原创 2023-09-05 07:08:30 · 649 阅读 · 0 评论 -
索引失效有哪几种情况?
如有好的面试知识或技巧期待您的共享!一站式解决面试问题,你可以搜索微信小程序。原创 2023-09-05 07:08:10 · 56 阅读 · 0 评论 -
Mysql中having语句与where语句的用法与区别
我们在写sql语句的时候,经常会使用where语句,很少会用到having,其实在mysql中having子句也是设定条件的语句与where有相似之处但也有区别。having子句在查询过程中慢于聚合语句(sum,min,max,avg,count)。而where子句在查询过程中则快于聚合语句(sum,min,max,avg,count)。having就是来弥补where在分组数据判断时的不足。因为where要快于聚合语句。如有好的面试知识或技巧期待您的共享!一站式解决面试问题,你可以搜索微信小程序。原创 2023-09-05 07:07:26 · 974 阅读 · 0 评论 -
为什么要分库分表?
分库:从单个数据库拆分成多个数据库的过程,将数据散落在多个数据库中。分表:从单张表拆分成多张表的过程,将数据散落在多张表内。原创 2023-09-05 07:07:05 · 1214 阅读 · 0 评论 -
如何分库分表?
因此,可以根据历史QPS、RT等数据评估,假设我们只需要3500数据库连接数,如果单库可以承担最高1000个数据库连接,那么我们就可以拆分成4个库。可以考虑通过垂直切分的方式,把商品信息、买家信息、卖家信息、支付信息都单独拆分成独立的表,并通过订单号跟订单基本信息关联起来。这是一种横向按业务维度切分的方式,比如常见的按会员维度切分,根据一定的规则把不同的会员相关的数据散落在不同的库表中。分库的时候除了要考虑平时的业务峰值读写QPS外,还要考虑到诸如双11大促期间可能达到的峰值,需要提前做好预估。原创 2023-09-05 07:06:43 · 512 阅读 · 0 评论 -
如何解决分库分表主键问题?
这都是你实际生产环境中必须考虑的问题。可以先看下我们之前的文章。如有好的面试知识或技巧期待您的共享!一站式解决面试问题,你可以搜索微信小程序。雪花算法和雪花算法的变种是大家常用的。从问题角度出发:我们需要一个。原创 2023-09-03 07:23:19 · 472 阅读 · 0 评论 -
说说MySQL主从复制?
从库IO线程将主库的binlog日志复制到其本地的中继日志relay log中 从库会启动一个IO线程,IO线程会跟主库建立连接,然后主库会启动一个特殊的二进制转储线程(binlog dump),二进制转储线程会读取主库上binlog中的事件,它不会一直对事件进行轮询,当它追赶上了主库就会进入睡眠状态,直到主库发送信号量通知其有新事件产生才会被唤醒。所谓并行复制,指的就是从库开启多个SQL线程,并行读取relay log中不同库的日志,然后并行重放不同库的日志,这是库级别的并行。原创 2023-09-03 07:22:59 · 131 阅读 · 0 评论 -
说说 MVCC 的工作原理?
当执行select操作是innodb默认会执行快照读,会记录下这次select后的结果,之后select 的时候就会返回这次快照的数据,即使其他事务提交了不会影响当前select的数据,这就实现了可重复读了。快照的生成当在第一次执行select的时候,也就是说假设当A开启了事务,然后没有执行任何操作,这时候B insert了一条数据然后commit,这时候A执行 select,那么返回的数据中就会有B添加的那条数据。这两个列,一个保存了行的创建时间,一个保存行的删除时间,并不是实际的时间,而是系统版本号。原创 2023-09-03 07:22:22 · 1250 阅读 · 2 评论 -
InnoDB 的默认隔离级别是什么?
所以,由于早期MySQL版本中binlog只有statement模式,而在读提交(RC)隔离级别下记录的binlog使用statement模式会导致主从数据不一致的问题,所以,MySQL选择使用可重复读(RR)作为默认隔离级别以保证主从复制数据一致性。在binlog中,记录日志的规则为:事务commit之后,记录日志。接下来,我们在看下在RR隔离机制下的相同案例:在RR隔离机制下,事务B的操作被阻塞,所以不会使得binlog在statement模式下记录顺序出现颠倒而导致主从数据不一致问题。原创 2023-09-03 07:19:22 · 761 阅读 · 0 评论 -
MySQL 是如何实现事务的四大特性的?
换句话说,ACID里的AID都是数据库的特征,也就是依赖数据库的具体实现。一致性是指事务执行结束后,数据库的完整性约束没有被破坏,事务执行的前后都是合法的数据状态。一致性是事务追求的最终目标,原子性、持久性和隔离性,实际上都是为了保证数据库状态的一致性而存在的。事务一致性的实现即需要数据库层面的保障,也需要应用层面的保障。保证事务与事务之间的执行是相互隔离的,事务的执行不会受到其他事务的影响。语句要么都执行,要么都不执行,是事务最核心的特性,事务本身来说就是以原子性来定义的,实现主要是基于。原创 2023-09-03 07:18:58 · 525 阅读 · 0 评论 -
说说redo log 与 undo log
InnoDB作为MySQL的存储引擎,数据存储在磁盘中,如果每次读写数据都要操作磁盘IO效率会很低,为此InnoDB提供了缓存(Buffer Pool),Buffer Pool中包含了磁盘中部分数据页的映射,作为访问数据库的缓冲:当从数据库读取数据时,会首先从Buffer Pool中读取,如果Buffer Pool中没有,则从磁盘读取后放入Buffer Pool;于是,redo log被引入来解决这个问题:当数据修改时,除了修改Buffer Pool中的数据,还会在redo log记录这次操作;原创 2023-09-03 07:18:39 · 411 阅读 · 0 评论 -
“数据类型不一致”会走索引吗?
mysql sql优化器,对于where后面字段类型为字符串的数字,如果用数字去匹配(就是不用引号引上数字),则不能由索引直接命中,需要全部扫描。如有好的面试知识或技巧期待您的共享!一站式解决面试问题,你可以搜索微信小程序。原创 2023-09-03 07:18:22 · 390 阅读 · 0 评论 -
说说 MySQL 中有那些锁
对于InnoDB表,在绝大部分情况下都应该使用行级锁,因为事务和行锁往往是我们之所以选择InnoDB表的理由。但在个别特殊事务中,也可以考虑使用表级锁。为了一站式解决面者刷题问题,部分内容可能存在摘录情况,如有侵权辛苦您留言联系我们,我们会删除文章或添加引用文案,Thanks!为了大家更加方便的刷题,我们对文章进行了分类和整理,免费为大家提供刷题服务。程序员不欺骗程序员,赶紧扫码打开小程序,间隙锁(Next-Key锁)InnoDB行锁实现方式。InnoDB行锁模式。InnoDB加锁方法。原创 2023-05-10 14:04:03 · 82 阅读 · 1 评论 -
Flink如何实现端到端的exactly-once?
Source 端:Flink Kafka Source 负责保存 Kafka 消费 offset,当 Chckpoint 成功时 Flink 负责提交这些写入,否则就终止取消掉它们,当 Chckpoint 完成位移保存,它会将 checkpoint barrier(检查点分界线) 传给下一个 Operator,然后每个算子会对当前的状态做个快照,保存到状态后端(State Backend)。为了大家更加方便的刷题,我们对文章进行了分类和整理,免费为大家提供刷题服务。程序员不欺骗程序员,赶紧扫码打开小程序,原创 2022-10-27 17:35:06 · 39 阅读 · 0 评论 -
说说Mysql的四种隔离级别
简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。这种隔离级别 也支持所谓的不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一select可能返回不同结果。这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的。原创 2022-10-28 09:30:00 · 2752 阅读 · 0 评论 -
举一个数据库死锁的例子,MySQL 怎么解决死锁?
这时用户B修改该条纪录,这时用户A的事务里锁的性质由查询的共享锁企图上升到独占锁,而用户B里的独占锁由于A 有共享锁存在所以必须等A释放掉共享锁,而A由于B的独占锁而无法上升的独占锁也就不可能释放共享锁,于是出现了死锁。仔细分析程序的逻辑,对于数据库的多表操作时,尽量按照相同的顺序进行处理,尽量避免同时锁定两个资源,如操作A和B两张表时,总是按先A后B的顺序处理,必须同时锁定两个资源时,要保证在任何时刻都应该按照相同的顺序来锁定资源。另一个用户B 访问表B(锁住了表B),然后企图访问表A;原创 2022-10-27 17:27:49 · 75 阅读 · 0 评论