在MySQL中,锁是用于解决并发访问冲突的核心机制。当多个事务同时操作数据库中的数据时(如读取、修改、删除),可能会出现数据不一致(如脏读、不可重复读、幻读)或操作冲突(如同时修改同一行),锁的作用就是通过合理限制不同事务的操作权限,保证数据的一致性和并发操作的正确性。本文只讨论InnoDB引擎下并 ...
GreatSQL函数索引失效分析:排序规则匹配机制 某项目中,客户使用SQL查询时,索引未生效,经排查发现查询使用的排序规则与函数索引的排序规则不一致,导致无法使用该函数索引。 一、排序规则不匹配的测试案例 '测试表结构如下' greatsql> SHOW CREATE TABLE test_fin ...
SQL 标准定义了 4 种隔离级别,从低到高依次为:读未提交→读已提交→可重复读→串行化。隔离级别越高,对并发问题的解决能力越强,但对性能的消耗也越大(因限制了并发操作)。 ...
首先给出要用到的数据: CREATE TABLE `t` ( `id` int(11) NOT NULL, `c` int(11) DEFAULT NULL, `d` int(11) DEFAULT NULL, PRIMARY KEY (`id`), KEY `c` (`c`) ) ENGINE=I ...
某系统是一个非常老的MySQL从数据库,某天收到主从复制异常的报警,发现从节点的slave_sql_running线程断开,异常日志显示MySQL *** table is marked as crashed and last (automatic?) repair failed 错误日志中显示cr ...
有些情况下,“查一行”也会执行特别慢,今天就看看什么情况会出现这个现象。 如果MySQL本身有很大压力,导致数据库服务器CPU占有率很高或IO利用率很高,这种情况所有语句的执行都可能变慢,不在本文讨论范围内。 为了分析,构建有10万行记录的表,建表语句如下: CREATE TABLE `t` ( ` ...
误操作后快速恢复数据 binlog 解析为反向 SQL 1.前言 本文将介绍使用 reverse_sql 工具将 GreatSQL 数据库的 binlog 解析为反向 SQL 语句。模拟误操作后,恢复数据。该工具可以帮助客户在发生事故时快速恢复数据,避免进一步的损失。使用 reverse_sql 工 ...
在MySQL中,有很多看上去逻辑相同,但性能差异巨大的SQL语句。对这些语句使用不当的话,就会不经意导致整个数据库压力变大。本文选择了三个这样的案例。 案例一:条件字段函数操作 假设现在维护了一个交易系统,其中交易记录表tradelog包含交易流水号(tradeid)、交易员id(operator) ...
假设有一个场景,一个英语学习APP首页有一个随机显示单词的功能,用户每次访问首页的时候,都会随机滚动显示三个单词。 已知表里有10000条记录,来看看随机选择3个单词有什么方法,又存在什么问题。 建表语句: mysql> CREATE TABLE `words` ( `id` int(11) NOT ...
外键 同时更新,现时删除 约束更新,约束删除 索引 优化查询 添加外键后,自动为这个字段添加上索引 举例 用户主表 user_info 用户扩展信息 user_extension 项目表 project_info 理解表与表的关系 一对一 一对多 多对一 多对多 在关系数据库中,实体间的关联关系通过 ...
假设要查询城市是“杭州”的所有人名字,并且按照姓名排序返回前1000个人的姓名与年龄。那么SQL语句可以写为: select city,name,age from t where city='杭州' order by name limit 1000; 本文主要想讨论这个语句是如何执行的,以及有什么参 ...
先放一下两阶段提交的图,在后续问题中会用到: 问题 在MySQL 02中,讲到为什么要使用两阶段提交时用的是反证法,说明了如果不使用两阶段提交,会导致MySQL出现主备数据不一致等问题。 那么如果在两阶段提交的不同瞬间,MySQL如果发生异常重启,是怎么保证数据完整性的呢? 如果在图中时刻A,也就是 ...
GreatSQL优化技巧:使用 FUNCTION 代替标量子查询 导语 本文案例涉及标量子查询,何为标量子查询呢?一般来说,介于 SELECT 与 FROM 之间的子查询就叫标量子查询,返回单行单列结果,可做为最外层 SELECT 结果集的一列。 举个例子: SELECT e.employee_na ...
count(*)的实现方式 在不同的MySQL引擎中,count(*)有不同的实现方式: MyISAM引擎把一个表的总行数存在磁盘上,执行count(*)时能直接返回总行数,效率很高; InnoDB引擎需要把数据一行一行从引擎里读出来,然后累积计数。 需要说明,本文讨论没有过滤条件的count(*) ...
摘要: 本文介绍在Ubuntu系统下配置NFS文件共享服务,实现MySQL服务器(165)向备份服务器(163)定时备份数据的方案。内容包括: NFS配置:服务端(163)安装nfs-kernel-server并设置共享目录,客户端(165)安装nfs-common并挂载共享文件夹。 MySQL备份... ...
一个InnoDB表包含两部分:表结构定义和数据。在MySQL 8.0版本前,表结构存在以.frm为后缀的文件里。之后的版本允许把表结构定义放在系统数据表中。由于表结构定义占用空间很小,所以主要讨论表数据。 接下来,先说明为什么简单删除表数据达不到表空间回收的效果,再介绍正确回收空间的方法。 参数in ...
一条SQL语句,正常执行时候特别快,但有时会变得特别慢,且这种情况很难复现,随机且持续时间很短,看上去像是“抖”了一下。 你的SQL语句为什么变“慢”了 在MySQL 02中,介绍了WAL机制,InnoDB在处理更新语句时,更新内存写完redo log后,就返回给客户端,本次更新成功。 而内存里的数 ...
场景引入 假设现在维护一个支持邮箱登录的系统,用户表定义如下: create table SUser(ID bigint unsigned primary key,email varchar(64), ... )engine=innodb; 由于登录方式为邮箱,那么一定会有下面这样的业务: sele ...
JDBC游标读不生效导致OOM问题排查分析 问题描述 程序使用游标读分批读取MySQL的数据,但是程序容器却发生OOM 基本信息 MySQL版本:8.0.25 JDBC版本:8.0.25 JDBC配置: connectionProperties=useUnicode=true;autoReconne ...
场景引入 我们知道,MySQL中一张表可以支持多个索引。但是写SQL语句时,并没有主动指定使用哪个索引,而是由MySQL来确定。而有时候,MySQL会选错索引,导致执行速度变得很慢。 举个例子,假设一张表里有(id,a,b)三个字段,并分别建立索引。然后往表中插入10万行记录,取值依次递增,即数据从 ...