Mysql高可用|索引|事务 | 调优

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
日志服务 SLS,月写入数据量 50GB 1个月
简介: Mysql高可用|索引|事务 | 调优

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家https://www.captainbed.cn/z


sql语句的执行顺序


我们在拿到sql片段的时候,我们去处理sql语句,见到众多的关键字时我们该如何去处理呢?


FROM:首先识别并检索FROM子句中指定的表或视图。如果有多个表,则进行必要的连接操作。


WHERE:接下来,将WHERE子句中指定的条件应用于从表或视图中检索到的行。只有满足条件的行才会被选中。


GROUP BY:如果有GROUP BY子句,那么结果集将根据指定的列进行分组。这一步将具有相似值的行组合成汇总行。


HAVING:在GROUP BY子句之后,HAVING子句用于过滤分组的行。你可以在HAVING子句中指定条件,以限制哪些组的行包含在结果中。


SELECT:然后对结果集应用SELECT子句,指定要检索的列。你可以使用聚合函数(如SUM、COUNT、AVG等)对分组或筛选后的数据进行计算。


DISTINCT:如果使用了DISTINCT关键字,将从结果集中删除重复的行。


ORDER BY:如果有ORDER BY子句,结果集将按照指定的列以及指定的顺序(升序或降序)进行排序。


LIMIT:最后,应用LIMIT子句以限制从查询结果返回的行数。这在只需要结果集的一个子集时非常有用。

关键词

连接

名字解释

内连接 :取得两张表中满足存在连接匹配关系的记录

外连接:不只取得两张表中满足存在连续匹配关系的记录,还包括某张表(或两张表)中不满足匹配关系的记录

交叉连接:笛卡尔积在sql中的实现

笛卡尔积:例如集合A={a,b},集合B={1,2,3},那么A✖ B={<a,o>,<a,1>,<a,2>,<b,0>,<b,1>,<b,2>,}。

sql语句


面试坑点


由于篇幅有限,我们以模拟数据库面试的角度去检验一下坑点


面试官:首先我想问一下你在建表过程中是否了解varchar和cahr的区别?


关键词:可变


面试官:若你在存储一些数据较大的类型时,blob和text是如何选择的


关键词:类型,容量,方式,操作


面试官:你知道datetime和timestamp的异同嘛?


关键词:范围,空间,时区,默认值


面试官:在mysql语句中,in和exists的区别是什么


关键词:表大小


面试官:你的项目库中有记录货币的场景嘛,用的是什么类型字段


关键词:精确数值


面试官:mysql怎么存储emoji的呢?


关键词:编码类型


面试官:你有好好了解删除操作嘛,请说出drop,delete与truncate的区别吧


关键词:类型,回滚,删除内容,删除速度


面试官:你了解过合并查询么,请说出UNION与UNION ALL的区别?


关键词:去重与性能


面试官:count(1 ) 、count(*) 、count(列名)的区别?


关键词:执行效果与执行速度


这些问题能答对几个? 是否需要回炉重造呢?

存储引擎

MYSQL存储引擎


MYSQL8渐渐流行,需要了解一下MyISAM。

SQL优化


sql优化是基于慢sql进行优化,主要有以下特征


慢查询日志 :开启MySQL的慢查询日志,再通过一些工具比如mysqldumpslow去分析对应的慢查询日志,当然现在一般的云厂商都提供了可视化的平台。

服务监控 :可以在业务的基建中加入对慢SQL的监控,常见的方案有字节码插桩、连接池扩展、ORM框架过程,对服务运行中的慢SQL进行监控和告警。


慢SQL优化主要有以下的方向

在SQL优化时,explain是优化的利器,我们平时的编写,也应该先explain,看查一下执行计划,看看是否有优化的空间

直接在select语句之前增加explain关键词,就会返回执行计划的信息



索引

这个是特别重要的内容,一定要彻底拿下

索引就像目录,帮助我们更快地查询表中的内容。当我们了解索引,我们要了解索引的物理存储方式,还要了解索引的特性,还要了解索引的方式有哪些,还有索引的对象

当我们在创建索引的时候我们需要注意索引的位置,和数量。我们应该将索引建在频繁查询的字段上面,不建议的有:

1. 低区分度的字段(性别)

2. 频繁更新的字段

3. 过长的字段(前缀索引):占位置太大

4. 无序值作为索引:主键有不确定性时,容易导致叶子节点频繁分裂,造成磁盘存储的碎片化

索引失效


  1. OR操作符
  2. 字段类型不匹配
  3. 使用了不适合索引的操作符
  4. 联合索引中未使用索引的列
  5. 索引列上使用函数或表达式
  6. 对索引进行运算
  7. 不等于或NOT IN操作符
  8. 使用IS NULL 或 IS NOT NULL操作符
  9. 关联字段编码格式不一致
  10. 优化器估计全表扫描更快


索引的数据结构


MySQL的默认存储引擎是InnDB,它使用B+树结构实现索引。B+树索引的结构简洁明了,具有以下特点:

+ 每个节点可以存储多个键值对,叶子节点可以存储实际的数据记录

+ 非叶子节点用于指引搜索方向,只存储了键值

+ 叶子节点之间使用双向指针连接,形成有序链表,方便范围查询和排序操作

+ B+树高度相对较低,可以减少磁盘的 I/O 操作

我们小结一下可以说B+树是一个树高相对较低,节点存储键值指引存储数据的叶子节点,而叶子节点之间为了方便查询排序操作用双指针形成了有序链表我们了解完索引的一些基本内容我们继续以面试题的角度去思考这些知识点

面试坑点


索引不适合哪些场景

你了解聚簇索引和非聚簇索引么

你了解覆盖索引么

索引是不是建的越多越好

你了解了MYSQL的数据结构是B+树,那么一棵B+树能存储多少条数据呢?

那为什么要用B+树,而不用二叉树和平衡二叉树

那Hash和B+索引的区别是什么呢

回表了解嘛

说说最左前缀原则/最左匹配原则

说说mysql5.6版本添加的索引下推优化

当谈到MySQL锁时,重要的内容包括锁粒度、锁模式、加锁机制和兼容性。

锁粒度是指锁定数据库对象的级别,包括行锁、页锁和表锁。行锁是最细粒度的锁,它锁定了表中的单个行,其他事务无法修改或访问该行。页锁是在页的级别上进行锁定,可以锁定一组相邻的行。表锁是最粗粒度的锁,它锁定整个表,其他事务无法修改或访问表中的任何行。


锁模式是锁定的方式,常见的锁模式包括记录锁、间隙锁、next-key锁、意向锁和插入意向锁。记录锁用于锁定行,间隙锁用于锁定区间,next-key锁是记录锁和间隙锁的组合,用于避免幻读问题。意向锁用于标识一个事务即将在某个粒度上加锁,插入意向锁用于表示事务即将在某个范围内插入新行。


加锁机制包括乐观锁和悲观锁。乐观锁假设并发操作不会产生冲突,只在提交时检查是否有其他事务修改了数据。悲观锁则假设并发操作可能会产生冲突,在整个操作过程中都持有锁,避免冲突的发生。


最后,兼容性指的是共享锁和排他锁之间的兼容性。共享锁允许多个事务同时读取但不允许修改数据,而排他锁在持有锁的事务完成之前不允许其他事务读取或修改数据。兼容性确保了事务之间的并发性和数据的一致性。


灵魂问题:mysql遇到过死锁嘛,你是如何解决的??


事务

四大特性

MySQL事务的四大特性,也被称为ACID特性,指的是原子性(Atomicity)、一致性

(Consistency)、隔离性(Isolation)和持久性(Durability)。

事务的隔离级别

事务的隔离级别决定了并发事务之间的可见性和影响范围,包括读取未提交数据(ReadUncommitted)、读取已提交数据(Read Committed)、可重复读(RepeatableRead)和串行化(Serializable)。


MySQL的默认隔离级别是可重复读(Repeatable Read),核心内容是保证在事务期间读取的数据不会受到其他并发事务的修改影响。然而,可重复读隔离级别仍可能导致幻读(Phantom Read)、脏读(Dirty Read)和不可重复读(Non-repeatable Read)的问题,其中幻读指的是一个事务在读取某个范围内的数据时,另一个事务在该范围内插入了新的数据,导致第一个事务的结果集发生变化;脏读指的是一个事务读取了另一个未提交事务的数据;不可重复读指的是在同一个事务中,多次读取同一条数据的结果不一致。

MVCC

MVCC是一种并发控制技术,通过为每个事务创建多个版本的数据来实现隔离性和并发性。

读写分离


数据库的读写分离是一种架构设计,旨在优化数据库性能并提高系统的可扩展性。它将数据库操作分为读操作和写操作,然后将这些操作分配给不同的数据库实例来处理。

实现读写分离的过程通常涉及以下几个步骤


配置主数据库(写库):为系统配置一个主数据库实例,负责处理所有写操作(如插入、更新、删除)。


配置从数据库(读库):配置一个或多个从数据库实例,用于处理读操作(如查询)。


同步主数据库和从数据库:确保从数据库与主数据库的数据保持同步。这可以通过数据库复制技术来实现,主数据库将写操作的日志传输给从数据库,并在从数据库上重放这些日志来保持数据一致性。


路由读操作到从数据库:在应用程序中使用合适的策略将读操作路由到从数据库。这可以通过使用负载均衡器或在应用程序代码中进行手动配置来完成。


处理写操作到主数据库:所有写操作都发送到主数据库进行处理。我们了解完一些基本内容我们继续以面试题的角度去思考这些知识点

面试坑点

主从复制原理你了解多少

主从同步延迟你了解么,该如何处理

你一般是如何分库的

那你一般是怎么分表的

水平分表有哪几种路由方式

不停机扩容如何实现

常用的分库分表中间件有哪些

说了这么多分表分库,你觉得这样会带来什么影响呢

百万级别以上的数据如何删除

百万千万级的大表改如何添加字段

MySQL数据库cpu飙升怎么办面对这篇文章的面试问题,你是否需要回炉重造呢?

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
3天前
|
存储 缓存 关系型数据库
MySQL底层概述—9.ACID与事务
本文介绍了数据库事务的ACID特性(原子性、一致性、隔离性、持久性),以及事务控制的演进过程,包括排队、排它锁、读写锁和MVCC(多版本并发控制)。文章详细解释了每个特性的含义及其在MySQL中的实现方式,并探讨了事务隔离级别的类型及其实现机制。重点内容包括:ACID特性(原子性、持久性、隔离性和一致性的定义及其实现方式)、事务控制演进(从简单的全局排队到复杂的MVCC,逐步提升并发性能)、MVCC机制(通过undo log多版本链和Read View实现高效并发控制)、事务隔离级别(析了四种隔离级别(读未提交、读已提交、可重复读、可串行化)的特点及适用场景)、隔离级别与锁的关系。
|
3天前
|
缓存 算法 关系型数据库
MySQL底层概述—8.JOIN排序索引优化
本文主要介绍了MySQL中几种关键的优化技术和概念,包括Join算法原理、IN和EXISTS函数的使用场景、索引排序与额外排序(Using filesort)的区别及优化方法、以及单表和多表查询的索引优化策略。
MySQL底层概述—8.JOIN排序索引优化
|
6天前
|
SQL 存储 关系型数据库
MySQL原理简介—9.MySQL索引原理
本文详细介绍了MySQL索引的设计与使用原则,涵盖磁盘数据页的存储结构、页分裂机制、主键索引设计及查询过程、聚簇索引和二级索引的原理、B+树索引的维护、联合索引的使用规则、SQL排序和分组时如何利用索引、回表查询对性能的影响以及索引覆盖的概念。此外还讨论了索引设计的案例,包括如何处理where筛选和order by排序之间的冲突、低基数字段的处理方式、范围查询字段的位置安排,以及通过辅助索引来优化特定查询场景。总结了设计索引的原则,如尽量包含where、order by、group by中的字段,选择离散度高的字段作为索引,限制索引数量,并针对频繁查询的低基数字段进行特殊处理等。
MySQL原理简介—9.MySQL索引原理
|
4天前
|
存储 关系型数据库 MySQL
MySQL底层概述—6.索引原理
本文详细回顾了:索引原理、二叉查找树、平衡二叉树(AVL树)、红黑树、B-Tree、B+Tree、Hash索引、聚簇索引与非聚簇索引。
MySQL底层概述—6.索引原理
|
1月前
|
SQL 存储 关系型数据库
MySQL秘籍之索引与查询优化实战指南
最左前缀原则。不冗余原则。最大选择性原则。所谓前缀索引,说白了就是对文本的前几个字符建立索引(具体是几个字符在建立索引时去指定),比如以产品名称的前 10 位来建索引,这样建立起来的索引更小,查询效率更快!
115 22
 MySQL秘籍之索引与查询优化实战指南
|
24天前
|
存储 关系型数据库 MySQL
MySQL索引学习笔记
本文深入探讨了MySQL数据库中慢查询分析的关键概念和技术手段。
|
27天前
|
存储 关系型数据库 MySQL
浅入浅出——MySQL索引
本文介绍了数据库索引的概念和各种索引结构,如哈希表、B+树、InnoDB引擎的索引运作原理等。还分享了覆盖索引、联合索引、最左前缀原则等优化技巧,以及如何避免索引误用,提高数据库性能。
|
23天前
|
关系型数据库 MySQL 数据库连接
数据库连接工具连接mysql提示:“Host ‘172.23.0.1‘ is not allowed to connect to this MySQL server“
docker-compose部署mysql8服务后,连接时提示不允许连接问题解决
|
10天前
|
关系型数据库 MySQL 数据库
Docker Compose V2 安装常用数据库MySQL+Mongo
以上内容涵盖了使用 Docker Compose 安装和管理 MySQL 和 MongoDB 的详细步骤,希望对您有所帮助。
81 42
|
1天前
|
关系型数据库 MySQL 网络安全
如何排查和解决PHP连接数据库MYSQL失败写锁的问题
通过本文的介绍,您可以系统地了解如何排查和解决PHP连接MySQL数据库失败及写锁问题。通过检查配置、确保服务启动、调整防火墙设置和用户权限,以及识别和解决长时间运行的事务和死锁问题,可以有效地保障应用的稳定运行。
40 25