域名是网站吗,广西网络推广公司,微信开放平台网站应用,wordpress门户站其他资料
每日速记10道java面试题01-CSDN博客
每日速记10道java面试题02-CSDN博客
每日速记10道java面试题03-CSDN博客
每日速记10道java面试题04-CSDN博客
每日速记10道java面试题05-CSDN博客
每日速记10道java面试题06-CSDN博客
每日速记10道java面试题07-CSDN博客
每…其他资料
每日速记10道java面试题01-CSDN博客
每日速记10道java面试题02-CSDN博客
每日速记10道java面试题03-CSDN博客
每日速记10道java面试题04-CSDN博客
每日速记10道java面试题05-CSDN博客
每日速记10道java面试题06-CSDN博客
每日速记10道java面试题07-CSDN博客
每日速记10道java面试题08-CSDN博客
每日速记10道java面试题09-CSDN博客
每日速记10道java面试题10-CSDN博客
每日速记10道java面试题11-CSDN博客
每日速记10道java面试题12-CSDN博客
每日速记10道java面试题13-CSDN博客
目录 1.索引这么好用那我建一堆索引不好吗
2.MySQL中使用索引就一定有效吗 3.请详细描述MySQL中的B树中查询数据的全过程
4.为什么MySQL选择使用B树作为索引结构
5.为什么不使用B树呢两者的区别在哪?
6.MySQL是如何实现事务的
7.请你详细聊聊MySQL中的锁
8.什么是MySQL中的Redo Log
9.什么是MySQL中的Undo Log
10.什么是MySQL中的MVCC 1.索引这么好用那我建一堆索引不好吗
1索引并不是越多越好索引是会占用空间的而且每次修改数据的时候还要维护索引的数据要是建的太多维护的成本会很高。
2对于字段的值有大量重复的不要建立索引例如性别字段一般只有男或女0或1有大量重复的值因此它的选择性很低意味着很多行都会匹配到同一个索引值这样的话建立索引也不能提高检索速度。
3对于一些长字段也不应该建立索引特别是文本字段建立出来的索引结构特别庞大而且特别占内存如果一定要的话那就要截取字段中的一部分来建索引。
4当数据库的修改频率远大于查询频率时也不该建索引因为建索引是会影响更新操作的因为每次更新数据同时也要更新索引因此会很消耗性能。
2.MySQL中使用索引就一定有效吗
1.查询列未涉及到索引列不会触发索引 2.如果数据表量很小可能不会走索引直接全表查询 3.可以使用EXPLAIN命令得到MySQL的执行计划其中type表示是否执行了索引key表示使用了哪个索引 4.如果查询中存在函数或者表达式索引失效 5.如果查询中涉及!索引失效 6.如果查询中%Like索引也会失效但不是所有的模糊都失效后模糊不失效 7.如果随便使用or必须or的两个字段都有索引索引才会生效 8.相同字段的类型不相同会涉及到转换索引也会失效 9.表中两个不同的字段进行比较索引会失效 10.使用了is not null索引会失效 11.使用了order by索引失效 3.请详细描述MySQL中的B树中查询数据的全过程
首先从根节点开始根据键值来判断是左子树还是右子树逐层搜索直到找到叶子节点即对应的数据页。在确定了待查找数据就存在于这个数据页上之后我们将这个数据页加载到内存通过页目录做二分查找定位出一个粗略的记录分组最后在这个分组里通过链表遍历的方式来找到指定记录。
4.为什么MySQL选择使用B树作为索引结构
1.B树是一种自平衡树每个叶子节点到根节点的路径长度相同在插入和删除结点是进行分裂和合并操作以保持树的平衡让树的高度不会太高。
2.非叶子节点仅保存主键或索引值的页面指针使得每一页能容纳更多的记录因此内存中就能存放更多索引。
3.B树特别适合范围查询因为叶子节点通过链表连接从根节点定位到叶子节点查找到范围的起点之后只需要顺序扫描链表即可遍历后续的数据非常高效。
延伸→为什么不使用B树呢两者的区别在哪?
5.为什么不使用B树呢两者的区别在哪?
1)B树每个节点都存储了完整的数据而 B 树非叶子节点仅存储 key 和指针完整数据存储在叶子节点。这使得 B 树可以在内存中存放更多索引页减少磁盘查询次数。 2)B树叶子组成了链表便于区间查找而 B树只能每一层遍历查找。 3)B 树查询时间更平均、稳定都需要从根节点扫描到叶子节点。而 B树则在非叶子节点就可能找到对应的数据返回。
6.MySQL是如何实现事务的
1.MySQL是通过锁,Redo log,Undo log,MVCC来实现的 2.使用InnoDB锁机制实现数据并发修改的控制实现事务的隔离性 3.Redo log记录日志修改的数据在崩溃时恢复未提交的更改实现事务的持久性 4.Undo log保留历史数据记录在事务执行失败后可以进行事务的回滚实现了原子性和隔离性5.MVCC(多并发版本控制)满足了非锁定读的需求支持读未提交读已提交可重复读的隔离性6.一致性时通过AID隔离性原子性持久性实现的
7.请你详细聊聊MySQL中的锁
MySQL中的锁有全局锁、表级锁、行级锁其中全局锁就是对整个数据库实例加锁加锁后整个实例就处于只读状态后续的 DML 的写语句 DDL 语句已经更新操作的事务提交语句都将被阻塞。
表级锁就是作用在表上的锁主要分类有表锁、元数据锁、意向锁其中表锁又分有表共享读锁和表独占写锁顾名思义就是作用在这张表上之后允许有多线程的读操作但只能有单线程的写操作。 元数据锁为了解决在增删改的时候表结构被修改然后造成前后不一致的情况是为了确保读写一致的锁。 意向锁是为了解决行锁和表锁的区别如果没有意向锁那在加上表锁之前需要逐行的遍历检查是否存在行锁如果没有就上表锁这样逐行遍历肯定是会比较消耗性能的。
行级锁分有间隙锁和临键锁针对两个索引记录之间的空间加锁防止其他事务在两个间隙之间添加记录。临键锁是行级锁和间隙锁的结合能够保证一定范围之内不会出现幻读。
延伸→什么是幻读
在一个事务中多次读取同一范围的数据由于另一个事务的插入操作导致读取到之前不存在的数据。
8.什么是MySQL中的Redo Log
重做日志记录的是事务提交时数据页的物理修改是用来实现事务的持久性。
该日志文件由两部分组成重做日志缓冲 redo log buffer以及重做日志文件redo log
file ,前者是在内存中后者在磁盘中。当事务提交之后会把所有修改信息都存到该日志文件中 , 用 于在刷新脏页到磁盘 ,发生错误时 , 进行数据恢复使用。
延伸→那Redo log是怎么进行数据恢复使用的呢
InnoDB的内存结构中有个Buffer PoolBuffer Pool中存放着数据页我们的增删改操作会先在Buffer Pool中进行增删改之后的数据页叫做脏页脏页会在一定时机之后通过后台线程刷新到磁盘中redo log是为了保证我们在进行脏页刷新发生错误时进行数据恢复从而保证事务的持久性。
延伸→具体是怎么的操作呢
有了redo log(内存中的Redolog Buffer 磁盘中的redo log file)之后会先将脏页记录在redo log buffer中在事务提交时再将redo log buffer 中的数据刷新到redo log file中内存到磁盘当脏页刷新磁盘错误时就可以通过redo log进行数据恢复。
9.什么是MySQL中的Undo Log
回滚日志用于记录数据被修改前的信息 , 作用包含两个 : 提供回滚(保证事务的原子性) 和 MVCC(多版本并发控制) 。
undo log和redo log记录物理日志不一样它是逻辑日志。可以认为当delete一条记录时 undo log中会记录一条对应的insert记录反之亦然当update一条记录时它记录一条对应相反的update记录。当执行rollback时就可以从undo log中的逻辑记录读取到相应的内容并进行回滚。
10.什么是MySQL中的MVCC
建议阅读我的另一篇文章MySQL数据表中的InnoDB引擎原理存储结构架构事务原理MVCC_mysql innodb存储引擎实现原理-CSDN博客