Mysql 面试
基础EXISTS 和 IN 有什么区别? EXISTS - 先对外表进行循环查询,再将查询结果放入 EXISTS 的子查询中进行条件比较,确定外层查询数据是否保留; IN - 先查询内表,将内表的查询结果作为条件,提供给外表查询语句进行比较; 索引是个前提,其实选择与否还是要看表的大小。你可以将选择的标准理解为小表驱动大表。在这种方式下效率是最高的。 比如下面这样: 12SELECT * FROM A WHERE cc IN (SELECT cc FROM B)SELECT * FROM A WHERE EXISTS (SELECT cc FROM B WHERE B.cc=A.cc) 当 A 小于 B 时,用 EXISTS。因为 EXISTS 的实现,相当于外表循环,实现的逻辑类似于: 123for i in A for j in B if j.cc == i.cc then ... 当 B 小于 A 时用 IN,因为实现的逻辑类似于: 123for i in B for j in A if j.cc == i.cc then .....
mysqldump 基本使用
mysqldump 介绍此工具的目的是将数据库导出到备份文件或将数据库移动到另一个 Web 主机。其他带分隔符的文本格式(如 XML 和 CSV)也可以使用 mysqldump 生成。这些简单的查询使备份过程更加容易。文件中的文本显示为一组 SQL 语句,以后可以将其重建为原始状态。 mysqldump 是做什么的? MySQL 数据库备份:使用 mysqldump 创建安全备份,保护您的数据免遭丢失或损坏。 MySQL 数据库版本控制:创建数据库版本,有点像您可以在任何阶段恢复到的 GIT 标签 MySQL 数据库迁移:mysqldump 简化了数据库传输,确保了服务器或环境转换期间的数据完整性。 设置开发环境:mysqldump 有助于复制生产数据,以实现一致且可靠的开发和测试设置。 导出数据的格式 SQL 语句:默认格式会生成一个 SQL 脚本,该脚本可用于重新创建数据库结构和数据。 压缩文件:mysqldump 可以生成 .gz (gzip,linux内置,windows需要单独下载exe文件) 或 .bz2 (bzip2) 等格式的压缩输出文件,从而节省空间。 XML...
Mysql 运维
Mysql 运维 如果你的公司有 DBA,那么我恭喜你,你可以无视 Mysql 运维。如果你的公司没有 DBA,那你就好好学两手 Mysql 基本运维操作,行走江湖,防身必备。 安装部署Windows 安装(1)下载 Mysql 5.7 免安装版 下载地址:https://dev.mysql.com/downloads/mysql/5.7.html#downloads (2)解压并创建 my.ini 在根目录 my.ini 文件示例: 123456789101112131415[mysqld]#设置3306端口port = 3306# 设置mysql的安装目录 这块换成自己解压的路径basedir=D:\\Tools\\DB\\mysql\\mysql-5.7.31# 允许最大连接数max_connections=200# 服务端使用的字符集默认为8比特编码的latin1字符集character-set-server=utf8# 创建新表时将使用的默认存储引擎default-storage-engine=INNODB[client]# 设置mysql客户端默认字符集defaul...
Mysql 优化
慢查询慢查询日志可以帮我们找到执行慢的 SQL。 可以通过以下命令查看慢查询日志是否开启: 1234567mysql> show variables like '%slow_query_log';+----------------+-------+| Variable_name | Value |+----------------+-------+| slow_query_log | ON |+----------------+-------+1 row in set (0.02 sec) 启停慢查询日志开关: 12345# 开启慢查询日志mysql > set global slow_query_log='ON';# 关闭慢查询日志mysql > set global slow_query_log='OFF'; 查看慢查询的时间阈值: 1234567mysql> show variables like '%long_query_time%';+----------...
Mysql 高可用
高可用高可用 指的是通过技术手段,确保数据库服务在出现各种故障时,能够快速、自动地恢复服务,从而保证业务的连续可用性。 复制复制是解决系统高可用的常见手段。其思路就是:不要把鸡蛋都放在一个篮子里。 复制解决的基本问题是让一台服务器的数据与其他服务器保持同步。一台主库的数据可以同步到多台备库上,备库本身也可以被配置成另外一台服务器的主库。主库和备库之 间可以有多种不同的组合方式。 MySQL 支持两种复制方式:基于行的复制和基于语句的复制。这两种方式都是通过在主库上记录 bin log、在备库重放日志的方式来实现异步的数据复制。这意味着:复制过程存在时延,这段时间内,主从数据可能不一致。 复制如何工作在 Mysql 中,复制分为三个步骤,分别由三个线程完成: binlog dump 线程 - 主库上有一个特殊的 binlog dump 线程,负责将主服务器上的数据更改写入 binlog 中。 I/O 线程 - 备库上有一个 I/O 线程,负责从主库上读取 binlog,并写入备库的中继日志(relay log)中。 SQL 线程 - 备库上有一个 SQL 线程...
Mysql 锁
Mysql 锁 不同存储引擎对于锁的支持粒度是不同的,由于 InnoDB 是 Mysql 的默认存储引擎,所以本文以 InnoDB 对于锁的支持进行阐述。 锁的分类为了解决并发一致性问题,Mysql 支持了很多种锁来实现不同程度的隔离性,以保证数据的安全性。 独享锁和共享锁InnoDB 实现标准行级锁定,根据是否独享资源,可以把锁分为两类: 独享锁(Exclusive),简写为 X 锁,又称为“写锁”、“排它锁”。 独享锁锁定的数据只允许进行锁定操作的事务使用,其他事务无法对已锁定的数据进行查询或修改。 使用方式:SELECT ... FOR UPDATE; 共享锁(Shared),简写为 S 锁,又称为“读锁”。 共享锁锁定的资源可以被其他用户读取,但不能修改。在进行 SELECT 的时候,会将对象进行共享锁锁定,当数据读取完毕之后,就会释放共享锁,这样就可以保证数据在读取时不被修改。 使用方式:SELECT ... LOCK IN SHARE MODE; 为什么要引入读写锁机制? 实际上,读写锁是一种通用的锁机制,并非 Mysql 的专利。在很多软件领域,都...
Mysql 事务
Mysql 事务 不是所有的 Mysql 存储引擎都实现了事务处理。支持事务的存储引擎有:InnoDB 和 NDB Cluster。不支持事务的存储引擎,代表有:MyISAM。 用户可以根据业务是否需要事务处理(事务处理可以保证数据安全,但会增加系统开销),选择合适的存储引擎。 事务简介事务概念“事务”指的是满足 ACID 特性的一组操作。事务内的 SQL 语句,要么全执行成功,要么全执行失败。可以通过 Commit 提交一个事务,也可以使用 Rollback 进行回滚。 ACIDACID 是数据库事务正确执行的四个基本要素。 原子性(Atomicity) 事务被视为不可分割的最小单元,事务中的所有操作要么全部提交成功,要么全部失败回滚。 回滚可以用日志来实现,日志记录着事务所执行的修改操作,在回滚时反向执行这些修改操作即可。 一致性(Consistency) 数据库在事务执行前后都保持一致性状态。 在一致性状态下,所有事务对一个数据的读取结果都是相同的。 隔离性(Isolation) 一个事务所做的修改在最终提交以前,对其它事务是不可见的。 持久性(Durabi...
Mysql 索引
索引简介MySQL 索引是一种数据结构,用于加快数据库查询的速度和性能 索引的优缺点B 树是最常见的索引,按照顺序存储数据,所以 Mysql 可以用来做 ORDER BY 和 GROUP BY 操作。因为数据是有序的,所以 B 树也就会将相关的列值都存储在一起。最后,因为索引中存储了实际的列值,所以某些查询只使用索引就能够完成全部查询。 ✔️️️️ 索引的优点: 索引大大减少了服务器需要扫描的数据量,从而加快检索速度。 索引可以帮助服务器避免排序和临时表。 索引可以将随机 I/O 变为顺序 I/O。 支持行级锁的数据库,如 InnoDB 会在访问行的时候加锁。使用索引可以减少访问的行数,从而减少锁的竞争,提高并发。 唯一索引可以确保每一行数据的唯一性,通过使用索引,可以在查询的过程中使用优化隐藏器,提高系统的性能。 ❌ 索引的缺点: 创建和维护索引要耗费时间,这会随着数据量的增加而增加。 索引需要占用额外的物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立组合索引那么需要的空间就会更大。 写操作(INSERT/UPD...
Mysql 存储引擎
概述在文件系统中,Mysql 将每个数据库(也可以称为 schema)保存为数据目录下的一个子目录。创建表示,Mysql 会在数据库子目录下创建一个和表同名的 .frm 文件保存表的定义。因为 Mysql 使用文件系统的目录和文件来保存数据库和表的定义,大小写敏感性和具体平台密切相关。Windows 中大小写不敏感;类 Unix 中大小写敏感。不同的存储引擎保存数据和索引的方式是不同的,但表的定义则是在 Mysql 服务层统一处理的。 MySQL 的存储引擎采用了插件的形式,每个存储引擎都面向一种特定的数据库应用环境。同时开源的 MySQL 还允许开发人员设置自己的存储引擎。 存储引擎相关操作查看存储引擎命令123456789101112# 查看支持的存储引擎SHOW ENGINES;# 查看默认的存储引擎SHOW VARIABLES LIKE 'storage_engine';# 查看某表所使用的存储引擎SHOW CREATE TABLE `table_name`;# 查看某数据库中的某表所使用的存储引擎SHOW TABLE STATUS LIKE ...
Mysql 架构
概述总的来说,MySQL 可以大体分为 Server 层和存储引擎层两部分。 Server 层包括连接器、查询缓存、解析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。 存储引擎层负责数据的存储和提取。其架构模式是插件式的,支持 InnoDB、MyISAM、Memory 等多个存储引擎。现在最常用的存储引擎是 InnoDB,它从 MySQL 5.5.5 版本开始成为了默认存储引擎。 Mysql 查询流程SQL 语句在 MySQL 中是如何执行的? 大概流程可以参考下图: flowchart TD A[“客户端连接”] --> B[“连接器<br>管理连接, 认证”] B --> C{“查询缓存<br>(仅MySQL < 8.0)”} C -- 缓存命中 --> D[直接返回结果] C -- 缓存未命中/无缓存 --> E[“解析器<br&...







