如果想要对 MySQL 的索引树有更深入的了解,掘金的小册子:《MySQL 是怎样运行的》

MySQL 是怎样运行的

以下是常见面试题

MySQL日志

MySQL日志系统

redo_log,undo_log,bin_log?

redo_log崩溃恢复

binlog redolog undolog

MySQL查询

菜鸟教程SQL内连接

exist和in区别

sql语句优化

MySQL索引

覆盖索引

索引类型:

  • 主键索引(innodb的主键为聚集索引,所有数据都存放在b+树叶节点)
  • 二级索引(辅助索引,叶节点data域记录主键的值,然后根据主键值,在主索引查找,也就是回表):唯一索引,普通索引,全文索引,联合索引

索引优化

索引下推

对于%*%的优化

男朋友连模糊匹配like %%怎么优化都不知道 (qq.com)

一种时通过建立全文索引,select ------ match -----

第二种通过reverse建立虚拟列,然后正这查,反转后查就行了。

MySQL主备

MySQL主备

主从复制,读写分离

MySQL的主从复制?

MySQL锁

MySQL中的锁(表锁、行锁)

MySQL锁总结

innodb的意向锁,为了允许行锁和表锁共存,实现多粒度锁机制,有了意向锁,意向锁都是表锁

  • 意向共享锁(IS):事务打算给数据行加行共享锁,事务在给一个数据行加共享锁前必须先取得该表的 IS 锁。
  • 意向排他锁(IX):事务打算给数据行加行排他锁,事务在给一个数据行加排他锁前必须先取得该表的 IX 锁。

Next-Key Locking :是当前行锁和间隙锁的结合

MySQL事务

对于 rr 能否防止幻读有争议

rr 能够防止花幻读?

可重复读能够防止幻读

首先快照读和当前读是不一样的。不能那快照读的结果和当前读进行比较,得出幻读结论。

对于 rr 不能防止幻读的例子的争论:

对幻读的定义:幻读对比的是两次当前读返回的结果。

概念太多了,不知谁对谁错了。。


mvcc

MySQL事务的ACID

MySQL的可重复读级别能解决幻读吗 - 宁愿呢 - 博客园 (cnblogs.com)

事务的四种隔离级别?脏读,不可重复读,幻读是什么?

mvcc原理?

MySQL的ACID如何实现的?

MySQL默认隔离级别?在默认隔离级别下能否解决幻读?

MVCC,undo,快照读,当前读

mvcc使用的快照存储在undo log链中,在select时会生成进行快照读,通过readview读取合适的版本数据。

在mvcc中select都是快照读,不需要加锁。

mvcc其他会对数据库进行修改的操作insert,update,delete等加锁操作,从而读取最新数据,也就是当前读。

在 InnoDB 存储引擎中,SELECT 操作的不可重复读问题通过 MVCC 得到了解决,而 UPDATE、DELETE 的不可重复读问题通过 Record Lock 解决,INSERT 的不可重复读问题是通过 Next-Key Lock(Record Lock + Gap Lock)解决的。

Record Lock:锁定一个记录上的索引,而不是记录本身

Gap Lock:锁定索引之间的间隙,但是不包含索引本身。

Next-Key Lock:它是 Record Locks 和 Gap Locks 的结合。

MySQL架构

MySQL架构

MySQL存储引擎

innodb

  • 支持事务,四种隔离级别

    • 读未提交,不需要加任何锁
    • 串行化,读写锁都加
    • RC和RR ,通过MVCC支持高并发,通过 MVCC + Next-Key Locking 防止幻读。
  • 默认行级锁,行级锁粒度更小,并发更高

  • 主键索引为聚簇索引(在索引中保存数据,而对于mysiam的主键是根据id查到地址,根据地址去拿到数据)

b+树

innodb的数据结构就是b+树。

  • 每个内部节点(非叶子节点)只存储索引键,叶子节点存储数据。

    • 这样每次磁盘io就能读取更多的键,一次io查询范围就更广,io次数更少,效率更高
    • 只有叶节点才存储数据,那么每次查询必须从根到叶子节点才能获得数据,因此查询更稳定
  • 叶节点之间有指针相连,方便范围查询。

AVL树和红黑树都是二叉树,树高太高,io效率太低。

AVL必须保持左右子树高度差不超过1,因此插入删除要通过旋转保持平衡,旋转很耗时,因此适合插入删除少,查找多的场景。

红黑树从根节点到叶节点最长路径不超过最短路径的2倍,相对于AVL树不要求那么平衡,因此旋转次数较少,适合查找少,插入删除多的场景。

三范式

第一范式:要求每一列都是一个字段

第二范式:对于键码不能有部份依赖。比如一张表有学生id,name,age,sex,课程id,课程name,

那么键码就是(学生id,课程id),name只部分依赖于学生id,课程name部分依赖于课程id,因此需要拆分为学生表和课程表

第三范式:对于键码不能有传递依赖,比如表有学生id,name,age,班级,班主任,那么有传递依赖:学生id-->班级-->班主任,因此拆分学生表和班级表

SQL优化

内联子查询

select id,(select rule_name from member_rule limit 1) as rule_name, member_id, member_type, member_name, status  from member_info m where status = 1 and create_time between '2020-09-02 10:00:00' and '2020-10-01 10:00:00';

索引列运算

select account_no, balance from accounts where balance + 100 = 10000 and status = 1;

类型转换

#user_id是bigint类型,传入varchar值发生了隐式类型转换,可以走索引。
select id, name , phone, address, device_no from users where user_id = '23126';
#card_no是varchar(20),传入int值是无法走索引
select id, name , phone, address, device_no from users where card_no = 2312612121;

函数运算

select DATE_FORMAT(create_time, '%Y-%m-%d'), count(*) from users where create_time between '2020-09-01 00:00:00' and '2020-09-30 23:59:59' group by DATE_FORMAT(create_time, '%Y-%m-%d');

复合索引,最左匹配,MySQL遵循的是索引最左匹配原则,对于复合索引,从左到右依次扫描索引列,到遇到第一个范围查询(>=, >,<, <=, between ….. and ….)就停止扫描,

MySQL---面经的更多相关文章

  1. Hadoop 中利用 mapreduce 读写 mysql 数据

    Hadoop 中利用 mapreduce 读写 mysql 数据   有时候我们在项目中会遇到输入结果集很大,但是输出结果很小,比如一些 pv.uv 数据,然后为了实时查询的需求,或者一些 OLAP ...

  2. mysql每秒最多能插入多少条数据 ? 死磕性能压测

    前段时间搞优化,最后瓶颈发现都在数据库单点上. 问DBA,给我的写入答案是在1W(机械硬盘)左右. 联想起前几天infoQ上一篇文章说他们最好的硬件写入速度在2W后也无法提高(SSD硬盘) 但这东西感 ...

  3. LINUX篇,设置MYSQL远程访问实用版

    每次设置root和远程访问都容易出现问题, 总结了个通用方法, 关键在于实用 step1: # mysql -u root mysql mysql> Grant all privileges o ...

  4. nodejs进阶(6)—连接MySQL数据库

    1. 建库连库 连接MySQL数据库需要安装支持 npm install mysql 我们需要提前安装按mysql sever端 建一个数据库mydb1 mysql> CREATE DATABA ...

  5. MySQL高级知识- MySQL的架构介绍

    [TOC] 1.MySQL 简介 概述 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司. MySQL是一种关联数据库管理系统,将数据保存在不同的表中,而 ...

  6. 闰秒导致MySQL服务器的CPU sys过高

    今天,有个哥们碰到一个问题,他有一个从库,只要是启动MySQL,CPU使用率就非常高,其中sys占比也比较高,具体可见下图. 注意:他的生产环境是物理机,单个CPU,4个Core. 于是,他抓取了CP ...

  7. 我的MYSQL学习心得(一) 简单语法

    我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...

  8. Entity Framework Core 实现MySQL 的TimeStamp/RowVersion 并发控制

    将通用的序列号生成器库 从SQL Server迁移到Mysql 遇到的一个问题,就是TimeStamp/RowVersion并发控制类型在非Microsoft SQL Server数据库中的实现.SQ ...

  9. Docker笔记一:基于Docker容器构建并运行 nginx + php + mysql ( mariadb ) 服务环境

    首先为什么要自己编写Dockerfile来构建 nginx.php.mariadb这三个镜像呢?一是希望更深入了解Dockerfile的使用,也就能初步了解docker镜像是如何被构建的:二是希望将来 ...

  10. 当忘记mysql数据库密码时如何进行修改

    因为长时间没有使用数据库了,或者把密码改完之后就忘了数据库密码,不能正常进入数据库,也无法修改密码,有一个简单的常用修改密码方式: 1.首先找到和打开mysql.exe和mysqld.exe所在的文件 ...

随机推荐

  1. RC4Drop加密:提升数据保护的新选择

    摘要:RC4Drop是一种基于RC4算法的加密技术,通过将明文数据分成多个部分并进行加密,实现了对数据的高效保护.本文将对RC4Drop加密技术的优缺点进行详细分析,并给出一个Java完整demo示例 ...

  2. TextBrewer:融合并改进了NLP和CV中的多种知识蒸馏技术、提供便捷快速的知识蒸馏框架、提升模型的推理速度,减少内存占用

    TextBrewer:融合并改进了NLP和CV中的多种知识蒸馏技术.提供便捷快速的知识蒸馏框架.提升模型的推理速度,减少内存占用 TextBrewer是一个基于PyTorch的.为实现NLP中的知识蒸 ...

  3. 强化学习基础篇[2]:SARSA、Q-learning算法简介、应用举例、优缺点分析

    强化学习基础篇[2]:SARSA.Q-learning算法简介.应用举例.优缺点分析 1.SARSA SARSA(State-Action-Reward-State-Action)是一个学习马尔可夫决 ...

  4. conda创建虚拟环境后文件夹中只有conda-meta文件夹,无法将环境添加到IDE中

    1.问题描述:anaconda的envs的其中一个环境目录下,没有python.exe文件,只有conda-meta和scripts 平时创建虚拟环境都是: conda create -n test ...

  5. C++ LibCurl实现Web隐藏目录扫描

    LibCurl是一个开源的免费的多协议数据传输开源库,该框架具备跨平台性,开源免费,并提供了包括HTTP.FTP.SMTP.POP3等协议的功能,使用libcurl可以方便地进行网络数据传输操作,如发 ...

  6. php获取服务器操作系统等信息

    php获取服务器操作系统等信息 获取请求页面时通信协议的名称和版本: $_SERVER['SERVER_PROTOCOL'] 例如,"HTTP/1.0". PHP程式版本:< ...

  7. CF1921F Sum of Progression 题解

    题目链接:CF 或者 洛谷 一道经典的类型题,把这种类型的题拿出来单独说一下. 注意到问题中涉及到需要维护 \(a_{x+k\times step}\) 这样的信息,这样的信息很难用树型结构维护,比较 ...

  8. 23.1 SEH之终止处理--《Windows核心编程》结构化异常处理

    (structured exception handing)SEH 包含终止处理和异常处理.本章讨论终止处理. 一.终止处理 终止处理程序确保不管一个代码块(被保护代码)如何退出的,另一个代码块(终止 ...

  9. Word-批量导出Word中的图片

    当我们需要把Word文件中的图片保存起来,你是如何导出Word图片呢?右键一张张保存图片吗?这效率太低了.如果文档中有大量的图片,这个方法会浪费很多时间. 下面给大家分享word如何批量导出图片的技巧 ...

  10. qwb2023落荒而逃版

    前言 qwb2023 .12.15 被打废了,N1决赛和qwb,有一个pwn可以做的但是已经在做misc看都不看--无语了. Pyjail ! It's myFILTER !!!|SOLVED|N1n ...