
MySQL
衣舞晨风
不预测,只应对
展开
-
dbaplus社群--打脸实录:MySQL插入是并发还是串行?
首先定义 用户信息表userInfo,其中id为自增,name具有唯一索引。MySQL innodb 插入记录是并发的。MySQL innodb 插入记录不存在幻读问题,MySQL 通过 mvcc+ ReadView解决幻读问题。原文地址:https://mp.weixin.qq.com/s/FcMi3gPCrxYqHSkz3dnKFA。原创 2024-07-26 23:00:00 · 1893 阅读 · 0 评论 -
MySQL select for update 加锁
当多人操作同一个客户下账号的时候,希望顺序执行,某个时刻只有一个人在操作;当然可以通过引入redis这种中间件实现,但考虑到并发不会很多,所以不想再引入别的中间件。通过简单的select for update 可以实现在并发不高的情况锁住数据。两个事务执行顺序按照SQL后面的指定,当指定到第三步的时候,能获取到具体数据。事务一、二 开两个终端或者在DBvear开两个窗口。先看下数据库自动提交有没有关闭。等到超时时间后,会提示错误。在执行第3步的时候会卡住。原创 2024-05-22 18:26:59 · 620 阅读 · 0 评论 -
表结构设计的 10 个规范
INT 类型不使用 unsigned 无符号属性,容易引入额外的计算问题。自增用 8 字节 BIG INT,不要使用 4 字节 INT,且自增在 MySQL 8.0 版本前有回溯问题,请考虑是否业务有影响。字符集使用 UTF8MB4 字符编码,不推荐 GBK、UTF-8 等其他字符集。日期类型用 DATETIME 类型,需要精确到毫秒用 DATETIME(6),不要使用 INT、TIMESTAMP。类型 JSON 可用于存储非结构化数据,典型场景为用户标签,不要将 JSON 用于频繁更新的字段场景.原创 2021-12-18 16:41:17 · 1414 阅读 · 0 评论 -
索引设计的 10 个规范
不要陷入设置单表行数、列数限制的固有印象,其他关系型数据库没有行数、列数限制,MySQL 也没有,大表的缺点不是性能,而是后续的 DDL 管理问题,随着 MySQL 8.0 快速加列功能的上线,大表 DDL 问题基本已解决。MySQL 是索引组织表,表中的数据以 B+ 树索引结构,根据主键逻辑排序,由于 B+ 树索引的特点是树的高度为 3~4 层,所以从数十亿的记录中,通过主键查询一条记录只需要 3、4 次 I/O,当前到 SSD 存储设备设置每秒至少能完成 10000 次的 I/O 查询,不要担心通过.原创 2021-12-18 16:48:57 · 895 阅读 · 0 评论 -
幻读与不可重复读
不少人会将幻读与不可重复读混淆,这是因为它们在自然语义上非常接近,都是在一个事务内用相同的条件查询两次,但两次的结果不一样。差异在于,对不可重复读来说,第二次的结果集相对第一次,有些记录被修改(Update)或删除(Delete)了;而幻读是第二次结果集里出现了第一次结果集没有的记录 (Insert)。一个更加形象的说法,幻读是在第一次结果集的记。录“间隙”中增加了新的记录。所以,MySQL 将防止出现幻读的锁命名为间隙锁(Gap Lock)。原创 2023-07-10 09:08:55 · 178 阅读 · 0 评论 -
MySQL意向锁(Intent Lock)
这时需要对数据表中的行逐一排查,检查是否有行锁,如果没有,才可以获取这张数据表的排它锁。这个过程是不是有些麻烦?这里就需要用到意向锁。返回数据表的场景,如果我们给某一行数据加上了排它锁,数据库会自动给更大一级的空间,比如数据页或数据表加上意向锁,告诉其他人这个数据页或数据表已经有人上过排它锁了,这样当其他人想要获取数据表排它锁的时候,只需要了解是否有人已经获取了这个数据表的意向排他锁即可。这样其他人如果想要获取整个房子的控制权,只需要看这个房子的标识即可,不需要再对房子中的每个房间进行查找。原创 2023-06-27 07:16:45 · 463 阅读 · 0 评论 -
SQL99 和 SQL92 的区别
我个人建议多表连接使用 SQL99 标准,因为层次性更强,可读性更强。原创 2023-06-27 07:13:18 · 306 阅读 · 0 评论 -
Nginx 代理MySQL
docker-compose.ymlversion: '2.0'services: nginx: restart: always image: nginx:1.13.9-alpine ports: - 63307:63306 volumes: - ./nginx.conf:/etc/nginx/nginx.confnginx配置文件user nginx;worker_processes 1;error_log /var/lo原创 2022-04-28 17:49:59 · 8719 阅读 · 0 评论 -
SQL UNION vs OR 性能
本文整理自:stackoverflow翻译自Bill Karwin回答:要么你读的那篇文章用了一个不好的例子,要么你误解了他们的观点。select username from users where company = 'bbc' or company = 'itv';等价于:select username from users where company IN ('bbc', '...原创 2020-04-12 10:31:18 · 2076 阅读 · 1 评论 -
MySQL技术内幕 InnoDB存储引擎:阻塞、死锁、锁升级
1、堵塞因为不同锁之间的兼容性关系,在有些时刻一个事务中的锁需要等待另外一个事务中的锁释放它所占用的资源,这就是堵塞。参数innodb_lock_wait_timeout用来控制等待的时间,默认50秒,是可以动态设置的。参数innodb_rollback_on_timeout用来设定是否在等待超时时对进行中的事务进行回滚操作。默认是OFF。(静态参数,无法是mysql运行时修改)在默...原创 2018-10-18 06:53:18 · 1012 阅读 · 1 评论 -
MySQL技术内幕 InnoDB存储引擎:B+树索引
B+ 树索引并不能找到一个给定键值的具体行。 B+ 树索引能找到的只是被查找数据所在的页。 然后数据库通过把页读入到内存, 再在内存中进行查找, 最后得到要查找的数据。平衡二叉树平衡二叉树的定义如下:首先符合二叉查找树的定义,其次必须满足任何节点的两个字数的高度最大差为1。最好的想能需要建立一颗最优二叉树,但是最优二叉树的建立和维护需要大量的操作,因此,用户一般只需要建立一颗平衡二叉树即...原创 2018-10-15 08:56:40 · 1065 阅读 · 0 评论 -
MySQL技术内幕 InnoDB存储引擎:Cardinality
并不是所有在查询条件中出现的列都需要添加索引,对于什么时候添加B+树索引,一般的经验是,在访问表中很少一部分行是使用B+树索引才有意义。查看索引是否是高选择性的,可以通过SHOW INDEX语句中的Cardinality列来观察。Cardinality是一个估计值,在实际中,Cardinality/n_rows_in_table应尽可能接近1,如果非常小,那么需要考虑是否还要建这个索引。索引的更...原创 2018-10-15 19:55:29 · 502 阅读 · 0 评论 -
MySQL技术内幕 InnoDB存储引擎:B+树索引的使用
1、联合索引MySQL允许对表上的多个列进行索引,联合索引的创建方法与单个索引创建的方法一样,不同之处仅在于有多个索引列。CREATE TABLE t( a INT, b INT,PRIMARY KEY(a),KEY idx_a_b(a, b))ENGINE=InnoDB多个键值的B+树对于查询SELECT*FROM TABLE WHERE a=xxx and b=xxx,显然...原创 2018-10-16 08:06:10 · 1059 阅读 · 0 评论 -
MySQL技术内幕 InnoDB存储引擎:事务
一、认识事务InnoDB储存引擎中的事务完全符合ACID的特性。ACID是以下4个词的缩写:原子性(Atomicity):一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚。一致性(consistency):数据库总是从一个一致性的状态转换到另一个一致性的状态。(其实原子性和隔离性间接的保证了一致性)隔离性(isolation):通常来说...原创 2018-10-19 07:49:19 · 619 阅读 · 1 评论 -
MySQL技术内幕 InnoDB存储引擎:行锁的3种算法
1、lock与latch在数据库中,lock与latch都可以成为锁,但两者有截然不同的含义latch 一般称为闩锁(轻量级的锁) 因为其要求锁定的时间非常短,若持续时间长,则应用性能非常差,在InnoDB存储引擎中,latch有可以分为mutex(互斥锁)和rwlock(读写锁)其目的用来保证并发线程操作临界资源的正确性,并且没有死锁检测的机制。lock的对象是事务,用来锁定的是数据库中的...原创 2018-10-17 08:17:32 · 2421 阅读 · 0 评论 -
MySQL技术内幕 InnoDB存储引擎:外键与锁
外键主要用于引用完整性的约束检查。在InnoDB存储引擎中,对于一个外键列,如果没有显示地对这个列加索引,InnoDB存储引擎会自动对其加一个索引,因为这样可以避免表锁。 这比Oracle数据库做得好,Oracle数据库不会自动添加索引,用户必须自己手动添加,这也导致了Oracle数据库中可能产生死锁。对于外键值的插入或更新,首先需要检查父表中的记录,既SELECT父表。但是对于父表的SELEC...原创 2018-10-17 08:23:18 · 608 阅读 · 0 评论 -
Databus for MySQL
IntroductionA frequently asked question on the Databus open source mailing list is about the possibility of capturing changes in MySQL through Databus. Below, we describe a proof-of-concept implement...转载 2018-12-31 16:32:44 · 1219 阅读 · 0 评论 -
查看MySQL InnoDB 表索引的高度
在看《MySQL技术内幕:InnoDB存储引擎》B+树索引章节中看到这么一句话:但是B+索引在数据库中有一个特点就是高扇出性,因此在数据库中,B+树的高度一般都在2-4层,也就是说查找某一键值的行记录时最多只需要2-4次IO。因为当前一般的机械磁盘每秒至少可以做100次IO,2-4次的IO意味着查询时间只需要0.02-0.04秒。那么,当一个表很大的时候,索引还是是2-4层吗?那么这是遍历...原创 2019-02-18 21:10:38 · 4086 阅读 · 2 评论 -
MySQL技术内幕 InnoDB存储引擎:锁问题(脏读、不可重复读)
1、脏读在理解脏读(Dirty Read)之前,需要理解脏数据的概念。但是脏数据和之前所介绍的脏页完全是两种不同的概念。脏页指的是在缓冲池中已经被修改的页,但是还没有刷新到磁盘中,即数据库实例内存中的页和磁盘中的页的数据是不一致的,当然在刷新到磁盘之前,日志都已经被写人到了重做日志文件中。而所谓脏数据是指事务对缓冲池中行记录的修改,并且还没有被提交(commit)。对于脏页的读取,是非常正常的...原创 2018-10-18 06:30:36 · 1015 阅读 · 2 评论 -
MySQL技术内幕 InnoDB存储引擎:分区表
一、MySQL分区表介绍分区是一种表的设计模式,正确的分区可以极大地提升数据库的查询效率,完成更高质量的SQL编程。但是如果错误地使用分区,那么分区可能带来毁灭性的的结果。分区功能并不是在存储引擎层完成的,因此不只有InnoDB存储引擎支持分区,常见的存储引擎MyISAM、NDB等都支持分区。但是并不是所有的存储引擎都支持,如CSV、FEDORATED、MERGE等就不支持分区。在使用此分区功...原创 2018-10-13 10:20:17 · 1276 阅读 · 0 评论 -
MySQL技术内幕 InnoDB存储引擎:一致性锁定读
在前一小节中讲到,在默认配置下,即事务的隔离级别为 REPEATABLE READ 模式下, InnoDB 存储引擎的 SELECT 操作使用一致性非锁定读。但是在某些情况下,用户需要显式地对数据库读取操作进行加锁以保证数据逻辑的一致性。而这要求数据库支持加锁语句,即使是对于SELECT的只读操作。InnoDB存储引擎对于SELECT语句支持两种一致性的锁定读(locking read)操作:S...原创 2018-10-11 21:22:08 · 755 阅读 · 0 评论 -
MYSQL SELECT INTO临时表
MySql不支持SQL SELECT INTO 这一语法SELECT *INTO new_table_name [IN externaldatabase] FROM old_tablename可以用下面的方式替代:CREATE TEMPORARY TABLE tmp_table( SELECT id, name FROM原创 2016-09-22 21:00:09 · 18316 阅读 · 2 评论 -
Mysql与Sql Server DATEDIFF函数
Sql Server:Mysql:SELECT DATEDIFF('2016-09-30', '2012-12-31');SELECT DATEDIFF('2012-12-31', '2016-09-30'); 在Sql Server中,该函数的第一个参数是开始日期,第二个是结束日期,开始日期应该在结束日期之前,这样算出来的结果是大于或等于0的一个数,反之是一个负数,但在MySQL中就完全相反,原创 2016-11-01 20:41:40 · 3899 阅读 · 0 评论 -
MySql 学习笔记一:SQL语句优化
一、数据库三范式第一范式:1NF是对属性的原子性约束,要求属性(列)具有原子性,不可再分解;(只要是关系型数据库都满足1NF) 第二范式:2NF是对记录的惟一性约束,要求记录有惟一标识,即实体的惟一性; 第三范式:3NF是对字段冗余性的约束,它要求字段没有冗余。 没有冗余的数据库设计可以做到。 但是,没有冗余的数据库未必是最好的数据库,有时为了提高运行效率,就必须降低范式标准,适当保原创 2016-10-04 19:08:27 · 1119 阅读 · 0 评论 -
MySql 学习笔记二:索引
一、索引的类型及添加1、主键索引,主键自动的为主索引 (类型Primary)当一张表,把某个列设为主键的时候,则该列就是主键索引。 如果你创建表时,没有指定主键索引,也可以在创建表后,再添加, 语句如下:alter table 表名 add primary key (列名);2、唯一索引 (UNIQUE)当表的某列被指定为unique约束时,这列就是一个唯一索引。CREATE TABLE ddd原创 2016-10-05 23:20:31 · 1187 阅读 · 0 评论 -
MySql 学习笔记四:表的拆分
一、水平划分如果一个表的记录数太多了,比如上千万条,而且需要经常检索,那么我们就有必要化整为零了。如果我拆成100个表,那么每个表只有10万条记录。当然这 需要数据在逻辑上可以划分。一个好的划分依据,有利于程序的简单实现,也可以充分利用水平分表的优势。比如系统界面上只提供按月查询的功能,那么把表按月 拆分成12个,每个查询只查询一个表就够了。如果非要按照地域来分,即使把表拆的再小,查询还是要联合所有原创 2016-10-07 15:10:11 · 1226 阅读 · 0 评论 -
Mysql 可能锁表的情况
情况一:insert into table1 values select … from table2 …. 此种方法,会锁table2 背景: 引擎:innodb 版本:5.6.23 作者:jiankunking 出处:http://blog.youkuaiyun.com/jiankunking原创 2016-11-01 20:46:46 · 852 阅读 · 0 评论 -
Mybatis Data truncation: Truncated incorrect DOUBLE value: '*'
具体异常信息如下:org.springframework.dao.DataIntegrityViolationException: ### Error querying database. Cause: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Truncated incorrect DOUBLE value: '*'原创 2016-10-28 21:22:21 · 5668 阅读 · 0 评论 -
MySql 时间比较:DATEDIFF函数与大于小于号
SELECT COUNT(*) FROM tableA WHERE RECORDDATE>='2015-11-11' AND RECORDDATE<='2016-11-11';SELECT COUNT(*) FROM tableA WHERE DATEDIFF(RECORDDATE,'2015-11-11')>=0 AND DATEDIFF(RECORDDATE,'2016-11-11')<=0;原创 2016-11-22 17:59:47 · 12006 阅读 · 2 评论 -
MySQL sleep连接过多 解决办法
如下图所示: 在Navicat Premium中可以看到很多处于sleep状态的连接,那怎么让mysql自动关闭这些处理sleep状态的连接呢?wait_timeout默认值: interactive_timeout默认值: sql命令:SHOW GLOBAL VARIABLES LIKE 'wait_timeout';SHOW GLOBAL VARIABLES LIKE 'inte原创 2016-12-07 22:53:58 · 12261 阅读 · 0 评论 -
MySQL 的CASE WHEN 语句使用说明
case when语句,用于计算条件列表并返回多个可能结果表达式之一。 CASE 具有两种格式: 一、简单 CASE 函数将某个表达式与一组简单表达式进行比较以确定结果。语法 简单 CASE 函数:CASE input_expression WHEN when_expression THEN result_expression [ ...n ] [原创 2016-12-07 22:46:22 · 8344 阅读 · 1 评论 -
MySql 学习笔记三:常用SQL优化
一、group by在使用group by 分组查询是,默认分组后,还会排序,可能会降低速度. 比如: 在group by 后面增加 order by null 就可以防止排序.二、join与子查询有些情况下,可以使用连接来替代子查询。因为使用join,MySQL不需要在内存中创建临时表。三、如何选择mysql的存储引擎?在开发中,我们经常使用的存储引擎 myisam / innodb/ m原创 2016-10-06 20:19:08 · 1090 阅读 · 1 评论 -
MySql 锁表 查找 命令
1、查询是否锁表show OPEN TABLES where In_use > 0;2、查询进程show processlist查询到相对应的进程,然后 kill id 3、查看正在锁的事务SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS; 4、查看等待锁的事务SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_原创 2016-12-21 20:32:36 · 1288 阅读 · 0 评论 -
MySql 存储过程 临时表 无法插入数据
今天在写存储过程的时候,发现一个问题就是,sql明明能查出数据,为啥无法插入到临时表、实体表呢? 存储过程截取如下:BEGIN /******************************** **作者:jiankunking **功能:demo **日期:2016-12-27 **修改日期:2016-01-09 *****************原创 2017-01-11 12:26:26 · 4679 阅读 · 1 评论 -
NAVICATE 修改存储过程提示PROCEDURE _Navicat_Temp_Stored_Proc already exists 解决方法
今天在写存储过程保存的时候,突然提示下面的错误:PROCEDURE _Navicat_Temp_Stored_Proc already exists 解决办法:DROP PROCEDURE _Navicat_Temp_Stored_Proc搞定原创 2017-01-12 19:24:57 · 16035 阅读 · 0 评论 -
MySQL索引背后的数据结构及算法原理
摘要本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题。特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,哈希索引,全文索引等等。为了避免混乱,本文将只关注于BTree索引,因为这是平常使用MySQL时主要打交道的索引,至于哈希索引和全文索引本文暂不讨论。文章主要内容分为三个部分。第一部分主要从转载 2017-01-20 16:30:33 · 706 阅读 · 0 评论 -
MySQL 查询所有表中的记录数
USE information_schema;SELECT table_name, table_rowsFROM TABLESWHERE TABLE_SCHEMA = 'lts'ORDER BY table_rows DESC;效果如下: 作者:jiankunking 出处:http://blog.youkuaiyun.com/jiankunking原创 2017-03-19 07:38:26 · 911 阅读 · 0 评论 -
MySQL技术内幕 InnoDB存储引擎:一致性非锁定读
一致性的非锁定行读(consistent nonlocking read)是指InnoDB存储引擎通过行多版本控制(multi versioning)的方式来读取当前执行时间数据库中行的数据。如果读取的行正在执行DELETE、UPDATE操作,这是读取操作不会因此而会等待行上锁的释放,相反,InnoDB会去读取行的一个快照数据。下图直观展示了一致性的非锁定行读:之所以称其为非锁定读,因为不需...原创 2018-10-11 21:13:47 · 625 阅读 · 2 评论 -
MySql与Sql Server Update语句
MySql:UPDATE TableAINNER JOIN tableB ON TableA.ITEMNO = tableB.ITEMNOSET TableA.column1 = tableB.column1, TableA.STATUS = IFNULL( tableB.ITEMSTATUS, 'ITEMSTATUS')WHERE ID = 'ID'AND原创 2016-09-22 20:58:56 · 1059 阅读 · 0 评论