![](https://img-blog.csdnimg.cn/20190915184639948.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
MySQL
文章平均质量分 64
数据库
keeper42
Just do one thing and do it well! 要么别做,要做就做到最好!
展开
-
【MySQL】幻读与间隙锁
幻读:前后多次读取,数据总量不一致。即使把所有的记录都加上锁,还是阻止不了新插入的记录,这是因为给行加锁的时候,这条记录还不存在,没法加锁。解决方案:间隙锁 (Gap Lock)间隙锁:在一行行扫描的过程中,不仅将给行加上了行锁,还给行两边的空隙,也加上了间隙锁。行锁,分成读锁和写锁。跟行锁有冲突关系的是“另外一个行锁”。但是间隙锁不一样,跟间隙锁存在冲突关系的,是“往这个间隙中插入一个记录”这个操作。间隙锁之间都不存在冲突关系。间隙锁和行锁合称 next-key lock,每个原创 2022-04-13 13:47:31 · 1044 阅读 · 0 评论 -
【MySQL】只查一行语句,执行慢的原因
只查一行语句,执行慢的原因执行“查一行”,可能会出现的执行长时间不返回被锁住和执行慢的情况。这其中涉及到了表锁、行锁和一致性读的概念。一、长时间不返回查询长时间不返回查询长时间不返回时,大概率是表 t 被锁住了。接下来分析原因的时候,一般都是首先执行一下 show processlist 命令,看看当前语句处于什么状态。有可能是行被锁住了吗? 为什么不太可能,因为这个SELECT不是 for update,因此即使有人占着行锁,SELECT只是返回已提交的数据即可,并不需要等到其他更新操作完成。原创 2022-04-13 13:46:35 · 1334 阅读 · 0 评论 -
【MySQL】SQL语句逻辑相同,性能却差异巨大?
学习于极客时间第一,对索引字段做函数操作,可能会破坏索引值的有序性,因此优化器就决定放弃走树搜索功能。mysql> select count(*) from tradelog where -> (t_modified >= '2016-7-1' and t_modified<'2016-8-1') or -> (t_modified >= '2017-7-1' and t_modified<'2017-8-1') or ->原创 2022-04-12 07:40:26 · 674 阅读 · 0 评论 -
【MySQL】如何正确地显示随机消息?
【MySQL】如何正确地显示随机消息?原创 2022-04-11 23:45:09 · 322 阅读 · 0 评论 -
【MySQL】全字段排序 与 rowid 排序
全字段排序为避免全表扫描,我们需要在 相关字段 字段加上索引。创建索引之后,我们用 explain 命令查看排序语句的执行计划。Extra 这个字段中存在“Using filesort”表示的就是需要文件排序,MySQL 会给每个线程分配一块内存用于排序,称为 sort_buffer。sort_buffer_size,就是 MySQL 为排序开辟的内存(sort_buffer)的大小。如果要排序的数据量小于 sort_buffer_size,排序就在内存中完成。但如果排序数据量太大,内存放不下,则不得原创 2022-04-08 09:19:08 · 865 阅读 · 0 评论 -
【MySQL】count(*)
count(*) 的实现方式你首先要明确的是,在不同的 MySQL 引擎中,count(*) 有不同的实现方式。MyISAM 引擎把一个表的总行数存在了磁盘上,因此执行 count(*) 的时候会直接返回这个数,效率很高;而 InnoDB 引擎就麻烦了,它执行 count(*) 的时候,需要把数据一行一行地从引擎里面读出来,然后累积计数。这里需要注意的是,我们在这篇文章里讨论的是没有过滤条件的 count(*),如果加了 where 条件的话,MyISAM 表也是不能返回得这么快的。由于使用 I原创 2022-04-08 08:14:22 · 1162 阅读 · 0 评论 -
【MySQL】MySQL 收缩表空间
【MySQL】MySQL count(*) 的实现方式原创 2022-04-07 23:52:25 · 757 阅读 · 0 评论 -
【MySQL】MySQL抖动
WAL机制InnoDB 在处理更新语句的时候,只做了写日志这一个磁盘操作。这个日志叫作 redo log(重做日志),相当于是用来缓存的,在更新内存写完 redo log 后,就返回给客户端,本次更新成功。WAL write ahead log,并不是说先写数据再写日志,在执行一条sql语句操作数据的时候,肯定要写日志,不过这个日志此时在内存中,还没有实际写到磁盘上,有的时候日志太大了,要等到日志都写到磁盘再真实写数据,效率很低,所以需要考虑是否能先写一部分数据。MySQL抖动空闲时flus原创 2022-04-05 10:19:44 · 495 阅读 · 0 评论 -
【MySQL】字符串字段创建索引的场景
字符串字段创建索引的场景 的方式有:1. 直接创建完整索引,这样可能比较占用空间;2. 创建前缀索引,节省空间,但会增加查询扫描次数,并且不能使用覆盖索引;3. 倒序存储,再创建前缀索引,用于绕过字符串本身前缀的区分度不够的问题;4. 创建 hash 字段索引,查询性能稳定,有额外的存储和计算消耗,跟第三种方式一样,都不支持范围扫描。...原创 2022-04-05 09:56:14 · 709 阅读 · 0 评论 -
【MySQL】MySQL 优化器选择索引
学习于极客时间--MySQL优化器选择索引的目的优化器选择索引的目的,是找到一个最优的执行方案,并用最小的代价去执行语句。在数据库里面,扫描行数是影响执行代价的因素之一。扫描的行数越少,意味着访问磁盘数据的次数越少,消耗的 CPU 资源越少。当然,扫描行数并不是唯一的判断标准,优化器还会结合是否使用临时表、是否排序等因素进行综合判断。其中,扫描行数是如何判断的呢?MySQL 在真正开始执行语句之前,并不能精确地知道满足这个条件的记录有多少条,而只能根据统计信息来估算记录数。这个统计信原创 2022-04-04 06:29:24 · 730 阅读 · 0 评论 -
【MySQL】Change Buffer
学习于极客时间--MySQL实战Change BufferInnoDB 从 1.0.x 版本开始引入了 Change Buffer,算是对 Insert Buffer 的升级。从这个版本开始,InnoDB 存储引擎可以对 insert、delete、update 都进行缓存。影响参数有两个:innodb_change_buffering:确定哪些场景使用 Change Buffer,它的值包含:none、inserts、deletes、changes、purges、all。默认为 all,表原创 2022-04-03 07:34:54 · 323 阅读 · 0 评论 -
【MySQL】唯一索引与普通索引的区别
2022.04.02唯一索引上的字段的数据只能是唯一的,而普通索引可以有重复数据。以 SELECT * FROM user WHERE k=5 为例,对于普通索引来说,k 是普通索引的话,会在普通索引上面找出满足条件的值,找到之后会继续往下找。对于唯一索引来说,会在索引上面找出满足条件的值后就停止不继续往下,因为这行数据是唯一的。从字面上看的话,这两者之间差距很大,因为唯一索引每次都是第一次就确定要的数据,但其实在内部的设计中,这两者之间差距并不是很大。为什么呢?因为 MySQL 是原创 2022-04-03 06:02:08 · 1818 阅读 · 0 评论 -
【MySQL】全局锁、表锁和行锁
学习于极客时间全局锁全局锁的典型使用场景是,做全库逻辑备份。Flush tables with read lock (FTWRL)。在备份过程中整个库完全处于只读状态。让整库都只读:(1)如果你在主库上备份,那么在备份期间都不能执行更新,业务基本上就得停摆;(2)如果你在从库上备份,那么备份期间从库不能执行主库同步过来的 binlog,会导致主从延迟。不加锁的话,备份系统备份的得到的库不是一个逻辑时间点,视图是逻辑不一致的。其实是有一个方法能够拿到一致性视图的,就是在可重复读隔离原创 2022-03-27 13:58:17 · 661 阅读 · 0 评论 -
【MySQL】索引
学习于极客时间哈希索引哈希索引做区间查询是很慢的,哈希表适用于只有等值查询的场景,比如 Memcached 及其他一些 NoSQL 引擎。有序数组索引有序数组在等值查询和范围查询场景中的性能就都很好。如果仅仅看查询效率,有序数组就是最好的数据结构了。但是,在需要更新数据的时候就麻烦了,你往中间插入一个记录就必须得挪动后面所有的记录,成本太高。有序数组索引只适用于静态存储引擎,比如你要保存的是省市这类几乎不会再修改的数据。二叉树索引二叉树为了维持 O(log(N)) 的查询复杂原创 2022-03-27 11:19:18 · 1336 阅读 · 0 评论 -
【MySQL】MySQL事务隔离
【MySQL】MySQL事务隔离事务就是要保证一组数据库操作,要么全部成功,要么全部失败。MySQL 原生的 MyISAM 引擎就不支持事务,这也是 MyISAM 被 InnoDB 取代的重要原因之一。事务隔离级别ACID(Atomicity、Consistency、Isolation、Durability,即原子性、一致性、隔离性、持久性)。多个事务同时执行时会遇到的问题:脏读:读到其他事务未提交的数据;不可重复读:前后读取的记录内容不一致;幻读:前后读取的记录数量不一致。原创 2022-03-21 17:45:03 · 982 阅读 · 0 评论 -
【MySQL】MySQL日志系统
【MySQL】MySQL(先占个坑)原创 2022-03-15 21:49:48 · 953 阅读 · 0 评论 -
基于MYSQL做实时计算
有时候我们会有这样的场景,在某个接口中,数据已经很规范地存入到一张的MYSQL表中,现在想对这样的数据做一些实时或准实时处理,比如数据多模式存储、异步准实时业务流程、业务实时监控等。接口中处理流程如下:最原始的方法,是改动业务代码,将这些额外的处理流程作为同步流程,在更新MYSQL数据之后同步执行。如下图:但是这样的处理流程可能会越来越多,如果一直作为同步流程,整个接口会变得越来越庞大、并且耗时越来越长、出问题的风险越来越高。所以我会考虑异步处理流程。如果可以改动一下代码,将数据额外写一原创 2021-02-19 11:24:21 · 331 阅读 · 0 评论 -
mysql异步复制与半同步复制的架构原理
在mysql5.5版本之前,复制都是异步复制,(关于异步复制的原理请大家自己参照下面的半同步复制,两者只是略有不同)。该复制经常遇到的问题是:因为binlog日志是推送的,所有主库和从库之间存在一定的延迟。 这样就会造成很多问题,比如主库因为磁盘损坏等故障突然崩掉,导致binlog日志不存在,同时因为延迟binlog还没有推送到从库,从库也就会丢失很多被主库提交的事物,从而造成主从不一致。解决如上的问题,mysql5.5版本之后引入了半同步复制机制。异步复制:主库写入一个事务commit提交并执行.原创 2021-02-19 11:23:03 · 103 阅读 · 1 评论 -
【Mysql】Mysql性能优化实战:数据库锁的介绍与索引查找原理
行级锁&表级锁什么是行级锁?什么是表级锁?学过程序的同学一定都对锁的概念有一定了解,顾名思义一个是锁住一行,一个是锁住一整张表,具体来看下面的例子:典型案例现有表T_A结构和数据如下开启一个事务(session_1)并执行如下语句事务一在session_1不提交的情况下,开启新事务(session_2)并执行语句事务二结果出现事务超时,问题来了,报错是出现锁超时说明使用了表级锁,可是不是说InnoDB是行级锁吗?这里需要注意行级锁必须使用了索引后才会生原创 2022-02-14 07:20:26 · 195 阅读 · 0 评论 -
【Mycat】用Mycat,学会数据库读写分离、分表分库
用Mycat,学会数据库读写分离、分表分库系统开发中,数据库是非常重要的一个点。除了程序的本身的优化,如:SQL语句优化、代码优化,数据库的处理本身优化也是非常重要的。主从、热备、分表分库等都是系统发展迟早会遇到的技术问题问题。Mycat是一个广受好评的数据库中间件,已经在很多产品上进行使用了。希望通过这篇文章的介绍,能学会Mycat的使用。安装Mycat官网:http://www.mycat.io/可以了解下Mycat的背景和应用情况,这样使用起来比较有信心。Mycat下载地址:htt原创 2021-02-03 11:06:11 · 228 阅读 · 0 评论 -
【Mycat】Mycat分库分表的简单实践
MySQL的使用场景中,读写分离只是方案中的一部分,想要扩展,势必会用到分库分表,可喜的是Mycat里已经做到了,今天花时间测试了一下,感觉还不错。关于分库分表当然自己也理了一下,分库分表的这些内容,如果分成几个策略或者阶段,大概有下面的几种。最上面的第一种是直接拆表,比如数据库db1下面有test1,test2,test3三个表,通过中间件看到的还是表test,里面的数据做了这样的拆分,能够在一定程度上分解压力,如果细细品来,和分区表的套路有些像。接下来的几类也是不断完善,把表test原创 2021-02-03 11:05:20 · 123 阅读 · 0 评论 -
【MySQL】MySQL索引实战汇总
MySQL索引对数据检索的性能至关重要,盲目的增加索引不仅不能带来性能的提升,反而会消耗更多的额外资源,本篇总结了一些MySQL索引实战经验。索引是用于快速查找记录的一种数据结构。索引就像是数据库中数据的目录,数据库在查询时,首先在索引中找到匹配的值,然后根据这个匹配值找到对应的数据行。MySQL中的索引的存储类型有两种:BTREE、HASH。索引是在存储引擎中实现的,也就是说不同的存储引擎,会使用不同的索引MyISAM和InnoDB存储引擎:只支持BTREE索引, 也就是说默认使用BTRE原创 2021-01-29 11:28:48 · 161 阅读 · 0 评论 -
【MySQL】如何通过索引说数据库优化能力
如果我们需要招个Java方面的高级程序员,一方面看年限(本科3年),具体到数据库方面的技能要求,包括如下三个方面:第一,是否会基本的增删改查,存储过程等技能,是否会用些groupby,having,distinct,exist,in,with等高级点的语句。这点一般都没问题,甚至一个刚毕业的大学生或工作经验2年之内的初级程序员也没问题,也就是说,这个是高级程序员必备的,你会了是应该,不会甚至不及毕业生。第二,有没有设计表的经验,这方面的面试技能也已经在数据库方面的面试技巧,如何从建表方面展示自己能力原创 2021-01-29 11:26:24 · 83 阅读 · 0 评论 -
【MySQL】关于数据库方面的面试技巧:如何从建表展现自己能力
在面试java web方面的高级程序员时,我一定会问到 jave core,java web(比如Spring MVC,Hibernate等)和数据库相关问题。在数据库方面,对于java 高级程序员而言,不仅需要会基本的增删改查,而且需要具备一定的“优化”方面的技能。优化是个大话题,可以从索引,建表和SQL 调优(SQL Tuning)方面入手,这个我们来分析下建表时需要注意的优化点。我一般会问候选人,“你有没有设计过数据表?”,大多数回答是设计过,接着我会比较阴险地问下:“你在设计表时是否用到了三原创 2021-01-29 11:25:18 · 197 阅读 · 0 评论 -
【MySQL】无备份情况下恢复MySQL误删的表,这样做再也不用怕误删了
本文主要分享在没有备份的情况下,MySQL数据库如何恢复被删除的表。包含两个主要的场景:1、drop table后的恢复2、truncate table后的恢复正文:我们都知道,MySQL Server都很多存储引擎,并不是每种都可以进行异常情况之下都恢复,比如drop table/tuncate table/delete table/update table /drop database又或者是ibdata文件损坏之类的。用的最多的就是Myisam和innodb存储引擎。目前基本上都是原创 2021-01-29 11:23:18 · 1289 阅读 · 1 评论 -
【MySQL】SQL之常用小技巧
一、返回插入新记录的IDINSERT Into 表名(字段列表) OUTPUT inserted.id VALUES(字段值列表)二、条件式排序SELECT * FROM 表名 ORDER BY CASE WHEN 字段名=某值 THEN 1 ELSE 0 END (ASC/DESC)三、清空表truncate table 表名//注意:Truncate table 的效果等同于 delete from table ,但 Truncate table 效率更高。//Delete原创 2021-01-29 11:17:44 · 272 阅读 · 1 评论 -
数据表冗余设计
冗余设计:就是多设计重复相同的东西。数据表冗余设计在大型系统中是必须的。随着系统数据量越来越大,实时查询的要求越来越高。通过我最近对整个系统运行的跟踪,我发现对于数据量特别大的系统,必须多做冗余式设计,对报表模块 多做数据缓存,来应对数据查询为了避免数据之间的关联查询导致性能的下降,提升程序效率。为了达到检索速度快,需要在关联非常复杂的表中多加冗余字段来提高系统的查询速度。所以采用冗余可以避免join连接 ,冗余也可以避免多次查询,减少检索次数,提升效率,例如: 一张物料主表A,一张物料明细原创 2021-01-08 11:27:20 · 2067 阅读 · 2 评论 -
数据库SQL优化大总结
1.对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:select id from t where num is null最好不要给数据库留NULL,尽可能的使用NOT NULL填充数据库.备注、描述、评论之类的可以设置为NULL,其他的,最好不要使用NULL。不要以为NULL不需要空间,比如:char(100)...转载 2020-12-02 10:52:41 · 63 阅读 · 0 评论 -
sql执行顺序
from join on where group by(开始使用select中的别名,后面的语句中都可以使用) avg,sum.... having select distinct order by limit原创 2020-12-01 22:45:22 · 61 阅读 · 0 评论 -
加了唯一索引,但数据还是有重复的
今天刚创建了一个表,为订单号创建了唯一索引。在测试同学测试的过程中,看了一下数据,竟然有重复订单号?怎么想都想不明白,问了另一个大牛,他告诉我:因为分库分表了。唯一键只能保证一个库中不重复,而不同库,无法限制。我分库用的是平台ID,分表用的是订单号,我看了一下那两条数据,果然,平台ID不一样,那么他们有可能不在一个库里。...转载 2020-11-19 11:35:01 · 401 阅读 · 0 评论 -
mysql 中 group by 与 order by 的顺序
mysql 中order by 与group by的顺序 是:selectfromwheregroup byorder by注意:group by 比order by先执行,order by不会对group by 内部进行排序,如果group by后只有一条记录,那么order by 将无效。要查出group by中最大的或最小的某一字段使用 max或min函数。例:select sum(click_num) as totalnum,max(update_time) as up.原创 2020-11-18 10:25:51 · 17686 阅读 · 0 评论 -
索引的基本概念及作用
索引:是一个数据结构,用来快速访问数据库表格或者视图里的数据,需要存储空间。数据库的索引的原理:主要用于提高查询效率,也就是按条件查询的时候,先查询索引,再通过索引找到相关的数据,索引相当于记录了对某个关键词,指定到不同的文件,或者文件里的不同位置的结构。索引会降低数据更新的效率,当插入、修改、删除时会引起索引结构的更新--建立索引--create [unique] index i_sex on student(studentname);--unique,可选,表明该索引中,不能有重原创 2020-11-09 21:14:09 · 2978 阅读 · 0 评论 -
【MySQL】leetcode184. 部门工资最高的员工
题目描述Employee 表包含所有员工信息,每个员工有其对应的Id, salary 和 department Id。+----+-------+--------+--------------+| Id | Name | Salary | DepartmentId |+----+-------+--------+--------------+| 1 | Joe | 70000 | 1 || 2 | Jim | 90000 | 1 ...原创 2020-09-24 17:01:34 · 212 阅读 · 0 评论 -
【MySQL】leetcode180. 连续出现的数字
题目描述编写一个 SQL 查询,查找所有至少连续出现三次的数字。+----+-----+| Id | Num |+----+-----+| 1 | 1 || 2 | 1 || 3 | 1 || 4 | 2 || 5 | 1 || 6 | 2 || 7 | 2 |+----+-----+例如,给定上面的 Logs 表, 1 是唯一连续出现至少三次的数字。+-----------------+| ConsecutiveNums |+...原创 2020-09-24 16:59:49 · 111 阅读 · 0 评论 -
【MySQL】leetcode178. 分数排名
题目描述编写一个 SQL 查询来实现分数排名。如果两个分数相同,则两个分数排名(Rank)相同。请注意,平分后的下一个名次应该是下一个连续的整数值。换句话说,名次之间不应该有“间隔”。+----+-------+| Id | Score |+----+-------+| 1 | 3.50 || 2 | 3.65 || 3 | 4.00 || 4 | 3.85 || 5 | 4.00 || 6 | 3.65 |+----+-------+例如,根据上述给...原创 2020-09-24 16:51:02 · 88 阅读 · 0 评论 -
【MySQL】leetcode177. 第N高的薪水
题目描述编写一个 SQL 查询,获取 Employee 表中第n高的薪水(Salary)。+----+--------+| Id | Salary |+----+--------+| 1 | 100 || 2 | 200 || 3 | 300 |+----+--------+例如上述Employee表,n = 2时,应返回第二高的薪水200。如果不存在第n高的薪水,那么查询应返回null。+------------------------+...原创 2020-09-24 16:48:28 · 72 阅读 · 0 评论 -
【MySQL】SQL的各种连接JOIN详解
SQL JOIN 子句用于把来自两个或多个表的行结合起来,基于这些表之间的共同字段。最常见的 JOIN 类型:SQL INNER JOIN(简单的 JOIN)、SQL LEFT JOIN、SQL RIGHT JOIN、SQL FULL JOIN,其中前一种是内连接,后三种是外链接。假设我们有两张表,Table A是左边的表,Table B是右边的表。id name 1 Google 2 淘宝 3 微博 4 Facebook id addr.转载 2020-09-23 16:31:24 · 159 阅读 · 0 评论 -
【MySQL】理解sql分组查询group by
理解group by语义个人认为sql中的group by和join是两大难点,因为它们转换了原来的表结构,group把表按某些字段统计缩小,join则使用笛卡尔积将多个表连接展开。咱们回到group by,顾名思义group即为分组,即将原来的一整块数据分成几小块。分组是聚合的前提,聚合是在每个分组内进行一些统计,如在分组内的最大值,最小值,平均值,个数等。未分组时查询返回的行直接与数据库表中的行对应,分组后分为多少组这个查询就会返回多少条记录,返回的记录中只能包含分组字段和在这个分组上的聚合转载 2020-09-23 15:45:11 · 687 阅读 · 0 评论 -
【MySQL】MySQL计算两个日期的天数
MYSQL自带函数计算给定的两个日期的间隔天数有两个途径可获得1、利用TO_DAYS函数select to_days(now()) - to_days('20120512')2、利用DATEDIFF函数select datediff(now(),'20120512')参数1 - 参数2 等于间隔天数3、利用TIMESTAMPDIFF函数计算两日期时间之间相差的天数,秒数,分钟数,周数,小时数,这里主要分享的是通过MySql内置的函数 ...转载 2020-09-23 14:53:03 · 2438 阅读 · 0 评论 -
【MySQL】MySQL基础
cmd命令行登录和退出MySQL服务器基本语法建表约束主键约束(PRIMARY KEY)自增约束(AUTO_INCREMENT)唯一约束(UNIQUE)非空约束(NOT NULL)默认约束(DEFAULT)外键约束(FOREIGN KEY)数据库的三大设计范式第一范式(1NF)第二范式(2NF)第三范式(3NF)内容较长我只贴事务的操作,其他的请关注我的微信公众号【JustKeepCoding】吧,一起学习!事务MySQL是如何控制事务 - COMMIT / ROLLBACK什么是回滚?举个例子:那如何将虚转载 2020-07-31 17:11:04 · 135 阅读 · 0 评论