如果想要对 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. 【一】分布式训练---单机多卡多机多卡(飞桨paddle1.8)

    1.分布式训练简介 分布式训练的核心目的: 加快模型的训练速度.通过对训练任务按照一定方法拆分分配到多个计算节点进行计算,再按照一定的方法对需要汇总的信息进行聚合,从而实现加快训练速度的目的. 1.1 ...

  2. NLP涉及技术原理和应用简单讲解【一】:paddle(梯度裁剪、ONNX协议、动态图转静态图、推理部署)

    参考链接: https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/advanced/gradient_clip_cn.html 1. ...

  3. 20.5 OpenSSL 套接字RSA加密传输

    RSA算法同样可以用于加密传输,但此类加密算法虽然非常安全,但通常不会用于大量的数据传输,这是因为RSA算法加解密过程涉及大量的数学运算,尤其是模幂运算(即计算大数的幂模运算),这些运算对于计算机而言 ...

  4. C/C++ MinHook 库的使用技巧

    在上面的各种Hook挂钩方式中,我们都是在手写封装代码,但这样的方式并不高效,真正的生产环境中我们必须使用现成的Hook库,常用的Hook库有免费开源的MinHook和商业的Detours Hook, ...

  5. Java21 + SpringBoot3整合springdoc-openapi,自动生成在线接口文档,支持SpringSecurity和JWT认证方式

    目录 前言 相关技术简介 OpenAPI Swagger Springfox springdoc swagger2与swagger3常用注解对比 实现步骤 引入maven依赖 修改配置文件 设置api ...

  6. uni-app 介绍及使用

    一.什么是uni-app uni-app由dcloud公司开发的多端融合框架,是一个使用 Vue.js 开发所有前端应用的框架,开发者编写一套代码,可发布到iOS.Android.Web(响应式).以 ...

  7. NC24755 [USACO 2010 Dec S]Apple Delivery

    题目链接 题目 题目描述 Bessie has two crisp red apples to deliver to two of her friends in the herd. Of course ...

  8. NC16122 郊区春游

    题目链接 题目 题目描述 今天春天铁子的班上组织了一场春游,在铁子的城市里有n个郊区和m条无向道路,第i条道路连接郊区Ai和Bi,路费是Ci.经过铁子和顺溜的提议,他们决定去其中的R个郊区玩耍(不考虑 ...

  9. 问题解决:Ubuntu18.04显示器分辨率不正常

    在Ubuntu18.04下出现显示器分辨率不正确的情况,只能选择1024x768的分辨率,没有其它选项,显示器本身可以支持1920x1080的分辨率.经查询,采用cvt, xrandr的方法不成功,显 ...

  10. 【Unity3D】角色控制器(CharacterController)

    1 简介 ​ 控制角色移动的组件主要有:Transform 组件.Rigidbody 组件.CharacterController 组件.Transform 组件通过控制角色位置实现移动,Rogidb ...