mysql
文章平均质量分 88
Young丶
这个作者很懒,什么都没留下…
展开
-
索引很难么?带你从头到尾捋一遍MySQL索引结构,不信你学不会
索引可以说是每个工程师的必备技能点,明白索引的原理对于写出高质量的 SQL 至关重要,今天我们就从 0 到 1 来理解下索引的原理,相信大家看完不光对索引还会对 MySQL 中 InnoDB 存储引擎的最小存储单位「页」会有更深刻的认识从实际需求出发假设有如下用户表:CREATE TABLE `user` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `name` int(11) DEFAULT NULL COMMENT '姓名', `a原创 2022-05-19 11:31:39 · 2387 阅读 · 1 评论 -
MySQL不会丢失数据的秘密,就藏在它的 7种日志里
进入正题前先简单看看MySQL的逻辑架构,相信我用的着。MySQL逻辑架构MySQL的逻辑架构大致可以分为三层:第一层:处理客户端连接、授权认证,安全校验等。第二层:服务器server层,负责对SQL解释、分析、优化、执行操作引擎等。第三层:存储引擎,负责MySQL中数据的存储和提取。我们要知道MySQL的服务器层是不管理事务的,事务是由存储引擎实现的,而MySQL中支持事务的存储引擎又属InnoDB使用的最为广泛,所以后续文中提到的存储引擎都以InnoDB为主。MySQL数据更新流程转载 2022-04-01 13:57:27 · 1443 阅读 · 0 评论 -
手把手教你分析MySQL死锁问题,十分钟看完文章下次轻松完成不加班
发生死锁了,如何排查和解决呢?本文将跟你一起探讨这个问题准备好数据环境模拟死锁案发分析死锁日志分析死锁结果环境准备数据库隔离级别:mysql> select @@tx_isolation;+-----------------+| @@tx_isolation |+-----------------+| REPEATABLE-READ |+-----------------+1 row in set, 1 warning (0.00 sec)自动提交关闭:mysql转载 2021-12-29 15:46:40 · 2666 阅读 · 0 评论 -
聊聊数据库优化的4大手段
当有人问你如何对数据库进行优化时,很多人第一反应想到的就是SQL优化,如何创建索引,如何改写SQL,他们把数据库优化与SQL优化划上了等号。当然这不能算是完全错误的回答,只不过思考的角度稍微片面了些,太“程序员思维”化了,没有站在更高层次来思考回答。那今天我们就将视角拔高,站在架构的角度来聊聊这一问题,数据库优化可以从哪些维度入手?正如上图所示,数据库优化可以从架构优化,硬件优化,DB优化,SQL优化四个维度入手。此上而下,位置越靠前优化越明显,对数据库的性能提升越高。我们常说的SQL优化反而是对性原创 2021-12-22 09:12:00 · 3798 阅读 · 0 评论 -
MySql各种锁机制的学习
数据库是一个多用户使用的共享资源。当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。**锁是用于管理对公共资源的并发控制。** 也就是说在并发的情况下,会出现资源竞争,所以需要加锁。 加锁解决了 多用户环境下保证数据库完整性和一致性。 使用锁的对象是事务,事务用来锁定数据库的对象是表、页、行。并且一般锁定的对象仅在事务commit或rollback后进行释放(不同事务隔离级别释放的时间可能不同)。原创 2021-12-03 00:31:06 · 4733 阅读 · 0 评论 -
6种MySQL数据库平滑扩容方案剖析
在项目初期,我们部署了三个数据库 A、B、C,此时数据库的规模可以满足我们的业务需求。为了将数据做到平均分配,我们在 Service 服务层使用 uid%3 进行取模分片,从而将数据平均分配到三个数据库中。如图所示:后期随着用户量的增加,用户产生的数据信息被源源不断的添加到数据库中,最终达到数据库的最佳存储容量。如果此时继续向数据库中新增数据,会导致数据库的 CRUD 等基本操作变慢,进而影响整个服务的响应速度。原创 2024-05-22 19:55:14 · 1231 阅读 · 0 评论 -
为什么 MySQL 不推荐使用 join?
但是问题来了,如果匹配到的数据量太大就不行了,也会导致返回的分页记录跟实际的不一样,解决的方法可以交给前端,一次性查询,让前端分批显示就可以了,这种解决方案的前提是数据量不太,因为 sql 本身长度有限。子查询就更别用了,效率太差,执行子查询时,MYSQL 需要创建临时表,查询完毕后再删除这些临时表,所以,子查询的速度会受到一定的影响,这里多了一个创建和销毁临时表的过程。关联查询的好处是可以做分页,可以用副表的字段做查询条件,在查询的时候,将副表匹配到的字段作为结果集,用主表去 in 它。原创 2024-05-20 19:25:06 · 803 阅读 · 0 评论 -
Mysql 备份恢复 mysqldump与xtrabackup备份
1、mysqldump: mysql 原生自带很好用的逻辑备份工具2、mysqlbinlog: 实现 binlog 备份的原生态命令3、xtrabackup: precona 公司开发的性能很高的物理备份工具备份的基本流程如下1.调用FTWRL(flush tables with read lock),全局禁止读写2.开启快照读,获取此时的快照(仅对innodb表起作用)3.备份非innodb表数据(*.frm,*.myi,*.myd等)4.非innodb表备份完毕后,释放FTWRL锁。原创 2024-05-20 19:22:08 · 1308 阅读 · 0 评论 -
Mysql分库分表概念与实践(映射关系表&基因法以及扩容方案)
将一个库的数据拆分到多个相同的库中,访问的时候访问一个库把一个表的数据放到多个表中,操作对应的某个表就行本文主要描述了我们进行水平分库分表设计时的一些常见方案。我们在进行分库分表设计时,可以选择例如范围分表,Hash 分表,路由表,或者一致性 Hash 分表等各种方案。进行选择时需要充分考虑到后续的扩容可持续性,最大数据偏斜率等因素。原创 2024-01-26 11:02:37 · 12375 阅读 · 0 评论 -
Centos7 两种方式安装 MySQL5.7 步骤 yum 、本地 tar 文件
它由 MySQL 的原始开发者制作,并保证保持开源。它由 MySQL 的原始开发者制作,并保证保持开源。因为没有安装下 / usr/local/mysq 目录下,所以需要修改成安装的 / az/mysql5.7 目录。由于 CentOS 的 yum 源中没有 mysql,需要到 mysql 的官网下载 yum repo 配置文件。命令中的用 % 代表所有 IP,如有需要,可换成指定 IP。可忽略,安装完成之后可以直接覆盖掉 MariaDB。密码就是初始化时生成的临时密码。密码为刚才获取的临时密码,即。原创 2024-01-24 11:01:02 · 3100 阅读 · 0 评论 -
两万字图文详解!InnoDB锁专题!
InnoDB 呢实现了两种标准的行级锁:共享锁(简称 S 锁)、排他锁(简称 X 锁)。共享锁:简称为 S 锁,在事务要读取一条记录时,需要先获取该记录的 S 锁。排他锁:简称 X 锁,在事务需要改动一条记录时,需要先获取该记录的 X 锁。如果事务T1持有行 R 的S锁,那么另一个事务T2请求访问这条记录时,会做如下处理:T2 请求S锁立即被允许,结果T1和T2都持有 R 行的S锁T2 请求X锁不能被立即允许, 此操作会阻塞如果T1持有行 R 的X锁,那么T2请求 R 的X、S锁都不能被立即允许,原创 2023-11-15 13:20:11 · 4574 阅读 · 0 评论 -
Mysql发生死锁的原因,已经解决方法详解
数据库的死锁是指不同的事务在获取资源时相互等待,导致无法继续执行的情况。MySQL中可能发生死锁的情况包括事务同时更新多个表、事务嵌套、索引顺序不一致以及不同事务同时更新相同的索引等。原创 2023-11-15 13:19:55 · 4433 阅读 · 1 评论 -
MySQL为什么Spring的jdbcTemplate.batchUpdate()这么慢?
Spring 的 JdbcTemplate.batchUpdate() 本身并不会影响性能,实际上 SQL 语句和 MySQL 数据库的处理方式才是决定因素。要改善性能,可以使用 JDBC 的批处理来批量执行 SQL 语句,或使用 MySQL 的多值插入来优化批处理。原创 2023-11-14 09:57:39 · 2876 阅读 · 0 评论 -
什么是MySQL事务嵌套
MySQL 事务嵌套是一种比较特殊、也不常见的现象。要注意事务相互影响的情况,确保数据安全性,同时避免在复杂业务逻辑中嵌套事务。原创 2023-11-14 09:56:55 · 792 阅读 · 0 评论 -
为什么我不建议你使用外键
这两张表中共有两个索引,一个是 Orders 表的主键索引,一个是 OrdersItems 表的外键索引,这就使得每次插入、更新或删除订单或订单项时,数据库需都要维护这两个索引,这可能会导致性能开销。当数据量大的时候,我们就要考虑分库分表了,但是在分库分表环境中,相关数据可能分布在不同的数据库中,外键通常难以跨越不同数据库来建立关系。更重要的是,分库分表环境中,MySQL 外键(Foreign Key)是用于建立表之间关系的,它定义了一个表中的一列或一组列,这些列的值必须在另一个表的主键列中存在。原创 2023-11-16 10:04:47 · 2320 阅读 · 0 评论 -
美团面试:为什么MySQL不建议使用NULL作为列默认值?
NULL值是一种对列的特殊约束,我们创建一个新列时,如果没有明确的使用关键字not null声明该数据列,Mysql会默认的为我们添加上NULL约束。有些开发人员在创建数据表时,由于懒惰直接使用 Mysql 的默认推荐设置。(即允许字段使用NULL值)。而这一陋习很容易在使用NULL的场景中得出不确定的查询结果以及引起数据库性能的下降。NULL并不意味着什么都没有,我们要注意NULL跟''(空值)是两个完全不一样的值。MySQL 中可以操作NULL值操作符主要有三个。IS NULL原创 2023-08-16 06:00:00 · 21990 阅读 · 0 评论 -
1万字+30张图 对mysql索引概念以及原理全方位讲解
相比于只有 name 一个字段的索引来说,索引页就多存了一个索引列。最后形成的 B + 树简化为如下图。原创 2023-07-25 07:30:00 · 24093 阅读 · 0 评论 -
Mysql小知识 delete 清空表之后,磁盘空间未发生变化?
当 ID 为 6 的记录被删除掉之后,这块空间并不会立马被释放出来,MySQL 只是在这个位置做一个删除标记,将来要是还有一个 ID 为 6 的数据被插入进来,就会插入到这里。MySQL 中的数据删除操作有点像我们平日里做业务开发时用的逻辑删除,当你想要删除掉一行数据的时候,这行数据其实并没有被真正的删除掉,只是暂时给标记为删除了而已。在上图这个 B+Tree 中,继续插入 5,就会造成页分裂,页分裂之后,2 所在的数据页(InnoDB 操作磁盘的最小单位是数据页)就会有空余,这也是空洞的一种。原创 2023-06-02 10:15:00 · 50119 阅读 · 0 评论 -
mysql 5.7+ 安装 错误 GPG key retrieval failed: [Errno 14] curl#37Couldn‘t open file /etc/pki/rpm-gpg/RPM
在安装mysql过程中出现一下错误。原创 2023-03-13 11:23:56 · 48368 阅读 · 0 评论 -
MySQL 中的 distinct 和 group by 哪个效率更高?
group bydistinctdistinctgroup bygroup bygroup bygroup bydistinctgroup by带着这两个问题找答案。接下来,我们先来看一下distinct和group by的基础使用。原创 2023-03-09 09:21:22 · 67025 阅读 · 3 评论 -
MySQL语句中过滤条件放在哪?on、where还是having,他们区别和联系
SQL语句中,过滤条件放在不同筛选器on、where和having的区别和联系。蚂蚁金服的一道如下:**SQL语句中,过滤条件放在on和where子句中的区别是什么?**当时满脑子是left join和inner join等,觉得没区别啊!当天晚上细思极恐,故梳理一下。在多表连接查询语法中,最令人迷惑的非on和where这两个筛选器的区别莫属了。在编写查询SQL脚本的时候,筛选条件无论是放在on子句还是where子句,查询到的结果集总是一模一样的,既然如此,为什么还要让sql查询支持两种筛选器呢?原创 2023-01-11 16:00:14 · 61862 阅读 · 4 评论 -
Mysql 性能优化的一些手段
mysql优化是多方面的,原则是减少系统的瓶颈,减少资源的占用,增加系统的反应速度。例如,通过优化文件系统,提高磁盘I/O的读写速度;通过优化操作系统调度策略,提高mysql在高负荷情况下的负载能力;优化表结构、索引、查询语句等使查询响应更快在mysql中,可以使用show status语句查询一些mysql的性能参数connections:连接mysql服务器的次数uptime:mysql服务器的上线时间slow_queries:慢查询的次数com_select:查询操作次数。原创 2022-11-09 04:30:00 · 18806 阅读 · 0 评论 -
excel百万数据如何导入导出
附上GitHub地址:https://github.com/alibaba/easyexcelGitHub地址上教程和说明很详细,并且附带有读和写的demo代码,这里对它的介绍我就不再详细说了。至于EasyExcel底层怎么实现的这个还有待研究。这次工作中遇到的问题也给我留下了深刻印象,同时也是我职业生涯添彩的一笔。最起码简历上可以写上你处理过上百万条数据的导入导出。最后说一下公司之前怎么做的,公司之前做法是。原创 2022-10-09 10:28:38 · 29483 阅读 · 0 评论 -
删库不跑路大法,真的好
会依次记录在小本本上,等到发现有人删库跑步之后,就对其进行恢复操作,而恢复的步骤,不是 ctrl+z 形式的回滚,而是找到开始点和结束点,就比如上面的例子,我们只要找到 创建库 到 插入数据那一段的日志,然后重新执行一遍。假设有一天,有老 6 偷了家,我们可以找到所有的 binlog,然后依次执行到被偷家的前一个小时。那有同学就说了,我就记的我昨天晚上不小心敲错了几个字母,昨天晚上到现在又有好多人执行了好多写入操作,这咋找呀!大家注意到没有,这里有时间信息,pos 信息,还有具体操作的日志文件,只能说比。原创 2022-10-09 09:49:38 · 25736 阅读 · 0 评论 -
Mysql数据库查询好慢,除了索引,还能因为什么?
数据查询过慢一般是索引问题,可能是因为选错索引,也可能是因为查询的行数太多。客户端和数据库连接数过小,会限制sql的查询并发数,增大连接数可以提升速度。innodb里会有一层内存buffer pool用于提升查询速度,命中率一般>99%,如果低于这个值,可以考虑增大buffer pool的大小,这样也可以提升速度。查询缓存(query cache)确实能为查询提速,但一般不建议打开,因为限制比较大,并且8.0以后的Mysql里已经将这个功能干掉了。原创 2022-09-13 13:55:03 · 28340 阅读 · 0 评论 -
聊聊数据库建表的15个小技巧
对于后端开发同学来说,访问数据库,是代码中必不可少的一个环节。系统中收集到用户的核心数据,为了安全性,我们一般会存储到数据库,比如:mysql,oracle等。后端开发的日常工作,需要不断的建库和建表,来满足业务需求。通常情况下,建库的频率比建表要低很多,所以,我们这篇文章主要讨论建表相关的内容。如果我们在建表的时候不注意细节,等后面系统上线之后,表的维护成本变得非常高,而且很容易踩坑。今天就跟大家一起聊聊,数据库建表的15个小技巧,希望对你会有所帮助。...原创 2022-09-01 02:30:00 · 29293 阅读 · 0 评论 -
mysql死锁是怎么发送的?
说个很早之前自己遇到过数据库死锁问题。有个业务主要逻辑就是新增订单、修改订单、查询订单等操作。然后因为订单是不能重复的,所以当时在新增订单的时候做了幂等性校验,做法就是在新增订单记录之前,先通过语句查询订单是否存在,如果不存在才插入订单记录。而正是因为这样的操作,当业务量很大的时候,就可能会出现死锁。接下来跟大家聊下。......原创 2022-09-02 04:00:00 · 28389 阅读 · 0 评论 -
顺丰快递:请签收MySQL面试灵魂十连问
根据场景选择什么字段作分表字段,比如淘宝日订单1000万,用userId作分表字段,数据查询支持到最近6个月的订单,超过6个月的做归档处理,那么6个月的数据量就是18亿,分1024张表,每个表存200W数据,hash(userId)%100找到对应表格。之所以出现快照读的情况,是基于提高并发性能的考虑,快照读的实现是基于多版本并发控制,即。:但有些操作并不是确定的,比如 uuid() 函数会随机产生唯一标识,当依赖 binlog 回放时,该操作生成的数据与原数据必然是不同的,此时可能造成无法预料的后果。..转载 2022-08-16 11:08:14 · 29576 阅读 · 0 评论 -
深分页问题,mysql查询 limit 1000,10 和limit 10 一样快吗?
比limit size要慢,且offset的值越大,sql的执行速度越慢。当offset过大,会引发深度分页问题,目前不管是mysql还是es都没有很好的方法去解决这个问题。只能通过限制查询数量或分批获取的方式进行规避。遇到深度分页的问题,多思考其原始需求,大部分时候是不应该出现深度分页的场景的,必要时多去影响产品经理。如果数据量很少,比如1k的量级,且长期不太可能有巨大的增长,还是用的方案吧,整挺好,能用就行。...原创 2022-08-15 13:58:53 · 32517 阅读 · 1 评论 -
阿里规范说MySQL单表行数不要超过2000w,为啥?
Mysql 的表数据是以页的形式存放的,页在磁盘中不一定是连续的。页的空间是 16K, 并不是所有的空间都是用来存放数据的,会有一些固定的信息,如,页头,页尾,页码,校验码等等。在 B+ 树中,叶子节点和非叶子节点的数据结构是一样的,区别在于,叶子节点存放的是实际的行数据,而非叶子节点存放的是主键和页号。索引结构不会影响单表最大行数,2kw 也只是推荐值,超过了这个值可能会导致 B + 树层级更高,影响查询性能。...原创 2022-08-13 09:15:00 · 19290 阅读 · 0 评论 -
聊聊mysql唯一索引的哪些坑,为什么还是产生重复数据?
前段时间我踩过一个坑:在mysql8的一张innodb引擎的表中,加了唯一索引,但最后发现数据竟然还是重复了。到底怎么回事呢?本文通过一次踩坑经历,聊聊唯一索引,一些有意思的知识点。原创 2022-08-06 08:00:00 · 25670 阅读 · 1 评论 -
InnoDB原理篇:聊聊数据页变成索引这件事
我们都知道平时执行crud的时候,都会从磁盘上加载数据页到的缓存页里去,更新缓存页后,由异步线程刷回磁盘的数据页。所以MySQL进行数据操作的最小单位是数据页,接下来就分析分析,数据页到底长什么样。每个数据页默认16kb的大小,数据页由多个部分组成,如下图所示当然这么多概念,只会挑重点,循循渐进的讲,所以大家莫慌。...原创 2022-08-05 02:15:00 · 24000 阅读 · 0 评论 -
当 update 修改数据与原数据相同时会被更新吗?
在binlog_format=row和binlog_row_image=FULL时,由于MySQL需要在binlog里面记录所有的字段,所以在读数据的时候就会把所有数据都读出来,那么。原创 2022-07-29 03:00:00 · 20440 阅读 · 0 评论 -
MySQL 默认隔离级别是RR,为什么阿里等大厂会改成RC?
主要是因为MySQL在主从复制的过程是通过bin log 进行数据同步的,而MySQL早期只有statement这种bin log格式,这种格式下,bin log记录的是SQL语句的原文。当出现事务乱序的时候,就会导致备库在 SQL 回放之后,结果和主库内容不一致。为了解决这个问题,MySQL默认采用了Repetable Read这种隔离级别,因为在 RR 中,会在更新数据的时候增加记录锁的同时增加间隙锁。可以避免这种情况的发生。在我知道MySQL 默认隔离级别是RR后,很长一段时间都以为应该不会有人去修改原创 2022-07-28 04:15:00 · 17974 阅读 · 0 评论 -
如果mysql磁盘满了,会发生什么?还真被我遇到了!
1)表的存储会出现碎片化,每当删除了一行内容,该段空间就会变为被留空,而在一段时间内的大量删除操作,会使这种留空的空间变得比存储列表内容所使用的空间更大;(2)当执行插入操作时,MySQL会尝试使用空白空间,但如果某个空白空间一直没有被大小合适的数据占用,仍然无法将其彻底占用,就形成了碎片;(3)当MySQL对数据进行扫描时,它扫描的对象实际是列表的容量需求上限,也就是数据被写入的区域中处于峰值位置的部分;这个是后来的图了,之前的图没有留,当时显示一张表里的data_free都达到了20个G。...原创 2022-07-27 05:15:00 · 16731 阅读 · 0 评论 -
MySQL 分库分表及其平滑扩容方案
在业务量不大时,单库单表即可支撑。当数据量过大存储不下、或者并发量过大负荷不起时,就要考虑分库分表。原创 2022-07-22 15:14:31 · 19916 阅读 · 0 评论 -
使用 LVS+Keepalived 实现 MySQL 双主复制负载均衡高可用
查看LVS集群状态。转载 2022-07-20 08:50:57 · 19438 阅读 · 0 评论 -
InnoDB解决幻读的方案 -- LBCC&MVCC
如果查询没有命中索引,则退化为表锁;如果等值查询唯一索引且命中唯一一条记录,则退化为行锁;如果等值查询唯一索引且没有命中记录,则退化为临近结点的间隙锁;如果等值查询非唯一索引且没有命中记录,退化为临近结点的间隙锁(包括结点也被锁定);如果命中记录,则锁定所有命中行的临键锁,并同时锁定最大记录行下一个区间的间隙锁。如果范围查询唯一索引或查询非唯一索引且命中记录,则锁定所有命中行的临键锁,并同时锁定最大记录行下一个区间的间隙锁。...转载 2022-07-19 11:38:33 · 19261 阅读 · 0 评论 -
mysql 高级内容——必须了解的mysql三大日志-binlog、redo log和undo log
日志是mysql数据库的重要组成部分,记录着数据库运行期间各种状态信息。mysql日志主要包括错误日志、查询日志、慢查询日志、事务日志、二进制日志几大类。作为开发,我们重点需要关注的是二进制日志(binlog)和事务日志(包括redolog和undolog),本文接下来会详细介绍这三种日志。.........原创 2022-07-18 15:42:30 · 19489 阅读 · 0 评论 -
MySQL 高级原理: MySQL执行过程及执行顺序
大多时候MySQL会自动根据SQL语句做出优化,使用最优的SQL语句进行查询。有时候MySQL无法根据SQL语句做出最优的优化顺序,所以还是要我们自己预判断出哪种过滤是最优,毕竟自己才最懂自己的数据。...原创 2022-07-16 03:00:00 · 24543 阅读 · 0 评论