
mysql数据库
虎哥和你一起学编程
路漫漫其修远兮吾将上下而求索
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
索引下推(index condition pushdown)
索引下推通常都是发生在联合索引的时候,当索引中包含所有需要过滤的条件时,就会直接在索引中过滤。通过explain查看执行引擎,可以看到using index condition的字样。索引下推是mysql 5.6版本做的一个优化,本质上是将server层做的过滤的工作下推到引擎层,从而减少了回表的操作,提高了效率。原创 2022-11-07 17:49:48 · 462 阅读 · 0 评论 -
order by rand()
当我们查询数据库需要随机排序的时候可以使用 order by rand()进行随机排序。 例如select * from table order by rand();原创 2022-01-11 10:19:40 · 4024 阅读 · 0 评论 -
并发插入duplicate-key导致的死锁
当mysql死锁时,可以通过show engine innodb status来查看死锁日志,可以看到发生死锁的sql。 复现一下: 先创建一个表 CREATE TABLE t1 (i INT, PRIMARY KEY (i)) ENGINE = InnoDB; session1START TRANSACTION;INSERT INTO t1 VALUES(1); session2...原创 2021-12-18 15:52:59 · 672 阅读 · 0 评论 -
mysql丢失更新问题
mysql丢失更新问题英文叫lost update.指的是两个事务同时更新一条数据,后更新的覆盖了前面更新的结果,从结果上看第一次的更新丢失了的现象。脏读,幻读,不可重复读是读的问题,丢失更新是写的问题。其实现在数据库本身并没有丢失更新的问题,因为当一个事务更新一条记录时,就会加排他锁,另外一个的更新就会阻塞住。通常都是由于程序产生的。可以通过乐观锁的方式来解决这个问题。...原创 2021-10-29 11:33:48 · 1773 阅读 · 0 评论 -
基于数据库实现分布式锁
基于数据库行记录实现的分布式锁基本方式,创建一张表,其中有一个代表资源的字段resource.同时需要对该字段加上唯一性约束。加锁时就往这张表里面添加一条记录,解锁时就把这条记录删掉。当然了还有很多其他的问题,例如性能,过期时间等。这些问题都暂不考虑. 1.创建表 CREATE TABLE `yh_distribute_lock` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键id', `re...原创 2021-08-24 14:21:52 · 271 阅读 · 0 评论 -
mysql jdbc连接url参数rewritebatchedstatements=true
如何我们在连接url里面没有添加这个rewritebatchedstatements=true的话,那么即使是在orm框架里面使用了saveBatch,updateBatch方法,结果也会变成单条执行。 使用这个参数后,经实验大概性能会提升20多倍,建议在连接的url里面都加上这个参数,尤其是在大批量数据的插入时非常的有效果。...原创 2021-07-06 18:13:27 · 1179 阅读 · 1 评论 -
mysql长事务
长事务顾名思义就是执行时间比较长的事务,这种长事务可能会导致数据库的内存紧张,在Innodb引擎下会导致有较大的回滚段存留,还会导致数据库的锁长时间不能释放,可能会拖垮整个数据库,可以通过以下的sql语句来查询超过60秒的长事务。 select * from information_schema.innodb_trx where TIME_TO_SEC(timediff(now(),trx_started)) > 60;...原创 2021-06-27 11:16:53 · 633 阅读 · 0 评论 -
Mysql执行update by id的过程
mysql执行一个select语句的过程大概是连接 --》权限校验-->查询缓存-->分析器-->执行器-->引擎 而update过程和select过程稍有不同,update会删除查询缓存。 首先会从磁盘上加载出对应id的行记录,然后记录redo日志 ,此时为prepare阶段,然后会记录binlog日志,然后再次提交redo日志,此时redo日志为commited阶段,注意此时的更新只是发生在内存里,等空闲时,再刷回磁盘。...原创 2021-06-27 10:58:09 · 868 阅读 · 0 评论 -
如何优化like左模糊匹配
通常我们大家都知道最左前缀匹配原则,如果like '%XY'这种情况就没办法使用索引,但是在业务场景中,这种情况又非常常见,那么针对这种情况该怎么优化呢? 1.可以将要全模糊匹配的列reverse存储,这样就可以通过like 'XY%' or reverse的列 like ‘YX%’ 的形式来实现,走索引 2.建立联合索引,使用索引覆盖的技术来让左模糊匹配也能走索引。索引覆盖指的是select的字段...原创 2021-05-25 10:07:24 · 3672 阅读 · 0 评论 -
mysql中datetime与timestamp类型有什么区别
datetime类型占8个字节,包含时区, timestamp类型占4个字节,不包含时区。 timestamp类型最多只能表示到2038年。The DATE, DATETIME, and TIMESTAMP types are related. This section describes their characteristics, how they are similar, and how they differ. MySQL recognizes DATE, ...原创 2021-05-21 18:17:21 · 198 阅读 · 0 评论 -
mysql并发死锁案例
我们通常会有这样的一个场景先查询有没有数据,然后进行插入或更新。 例如有如下场景,id为主键列 client1 start TRANSACTION;select * from `user` where id = 2 for UPDATE; client2start TRANSACTION;select * from `user` where id = 3 for UPDATE;...原创 2021-05-20 11:47:48 · 171 阅读 · 0 评论 -
explain之orderby优化
orderBy命中索引时,会直接按照索引的顺序不需要再排序,但是如果没有命中索引,就需要额外的一个sort的过程,如果我们使用explain会看到extra列会有using file sort的提示。 示例.一个表只有id和name两个字断。 id为主键索引,name没有索引 1.按索引排序 explain select * from `user` order by id; 结果(`id`, `select_type`, `tab...原创 2021-05-20 10:53:15 · 241 阅读 · 0 评论 -
死锁及示例
死锁需要满足四个条件 1.互斥 2.持有并等待 3.不可剥夺 4.环形 通常只需要打破其中任意一个就可以解决死锁的问题,通常可以打破第四条,例如资源有序分配的规则。 下面举一个mysql官方文档的死锁例子。 有两个客户端ClientA和ClientB 1.ClientA执行以下sql(持有s锁) START TRANSACTION;SE...原创 2021-05-20 10:10:52 · 546 阅读 · 1 评论 -
mysql间隙锁
我们知道mvcc可以解决快照读下的幻读问题,那么当我们出现当前读的时候,出现的幻读问题如何解决呢? 我们默认事务的隔离级别为rr(Repetable Read). 当前读的场景: select * from table lock in share mode; select * from table for update; insert into table; update table;...原创 2021-05-12 11:05:37 · 132 阅读 · 0 评论 -
mysql字段类型不一致导致的索引失效
1.新建一张表,并且加上索引CREATE TABLE `people` ( `id` int NOT NULL AUTO_INCREMENT COMMENT '主键id', `age` int unsigned NOT NULL DEFAULT '5' COMMENT '年龄', `name` varchar(30) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '姓名', `user_id` int DEFAULT NUL...原创 2021-04-16 11:36:43 · 1677 阅读 · 0 评论 -
Mysql 共享锁
共享锁又称读锁,又称S锁,S锁与S锁之间不互斥,S锁与X锁(排它锁之间互斥). select * from table where id = 3 lock in share mode 如图所示的sql就可以为表加上读锁。原创 2021-03-08 16:08:38 · 769 阅读 · 0 评论 -
mysql innodb通过使用mvcc来实现可重复读
我们知道innodb的引擎默认的隔离级别是可重复读,那么它是如何实现的呢,它通过mvcc(multi-version-concrrency-control)多版本并发控制,通过记录多个版本来实现读写并发的控制问题。 mvcc中,会为每一行记录添加两个隐藏字段(创建版本号+删除版本号),查询时要求创建版本号 <= 系统版本号,删除版本号 >= 系统版本号。下面通过例子来演示一下它的原理。 select:两个版本号都不变 ins...原创 2021-02-24 14:31:27 · 421 阅读 · 0 评论 -
基于ThreadLocal来实现动态数据源切换
如何在程序中做读写分离? 1.直接买阿里云的服务,让它自动帮我们做读写分离,我们客户端还是一个连接的url 2.客户端配置多数据源(主从数据库),然后在程序端通过动态数据源切换来切换数据源,基于ThreadLocal来实现。 关键代码 1.自定义注解(配置要使用哪个数据源) @Target({ElementType.METHOD, ElementType.TY...原创 2020-10-23 16:34:34 · 1972 阅读 · 1 评论 -
mysql explain关键字执行计划表解析系列一
当我们想分析慢sql,查看mysql的执行计划时,我们会使用explain 关键字,然后会得到执行计划表格信息。 例如我们执行下面的sql语句 explain select 1 from dual union select 2 from dual; 会得到如下的执行计划结果 先看第一列id,id表示执行的步骤的流水号,执行计划id的执行顺序遵循以下规则 ...原创 2020-09-05 13:06:47 · 194 阅读 · 0 评论 -
B+树与B树的对比分析
B+树和B树都是多叉树,像我们常见的二叉查找树,AVL树,红黑树都属于二叉树。我们都知道,InnoDB的索引底层的数据结构就是B+树,那么为什么不是B树呢? 我们先通过这个网站(百度搜索 data structure visualization)可以在线直观的看到B+树和B树的结构的区别 我们分别往B+树和B树里面插入111,222,333,444,555这五条数据,看一下它的分布有什么不同 先看B+树 再来看B树 ...原创 2020-08-22 17:49:37 · 878 阅读 · 0 评论 -
Mysql悲观锁
平常当我们update一条记录时,如果我们使用的是mysql,并且使用了事务,那么会隐式的加上行锁或表锁。那么如何在代码中显式的进行加锁呢。 select * from table for update即可显式的进行加锁,这是一种悲观锁。当我们在考虑接口幂等性时,其中一种就是通过悲观锁来解决的,但是悲观锁的效率比较低,有可能会造成大量的锁表,严重时会导致死锁的产生。 innodb中行锁是在索引的列才会产生,例如select * from table wh...原创 2020-07-20 10:47:53 · 554 阅读 · 0 评论 -
浅谈mysql limit的性能问题
我们都知道在mysql中使用limit分页,当limit后的offset很大时会有性能问题, 例如limit 10000,30 它会取出前10030条数据,然后舍弃前10000条,有点儿类似es的深分页问题。 例如我们写一个sql select * from user limit 1000...原创 2020-04-19 21:59:27 · 1579 阅读 · 0 评论 -
Mysql的InnoDB引擎的表锁与行锁
最近在开发中遇到表锁与行锁的问题,在此记录一下。 InnoDb引擎的行锁是利用索引来实现的,所以在一个非索引的字段上进行Update/Delete时会锁住全表,这个是一个大坑,在此记录一下,给碰到该问题的同学提个醒。 ...原创 2019-11-20 13:38:52 · 125 阅读 · 0 评论 -
mysql逗号分隔的字符串如何搜索
通常我们在设计数据库一对多的时候,会采用逗号分隔的字符串的形式来表示,但是查询的时候如何查询呢? 以下提供两种方式来查询 原始数据 INSERT INTO test(pname,pnum) VALUES('产品1','1,2,4');INSERT INTO test(pname,pnum) VALUES('产品2',...原创 2019-10-30 10:55:58 · 2746 阅读 · 0 评论 -
mybatis的foreach标签
JDBC有批处理,mybatis中的foreach标签也支持批处理,功能非常强大,在动态sql中是很重要的一员,今天就给大家来讲一下foreach标签。 <foreach collection="***" item="***" index="***" separator="***" open="***" close="***"> colle原创 2018-02-27 22:39:06 · 492 阅读 · 0 评论 -
如何处理数据库动态字段
随着业务的不断扩展,突然面临着这样一种场景:需要动态的增添数据库的字段,例如用户自定义的标签,列的数量都不能确定,这种情况怎么办呢,我首先想到的是用alter直接动态的增删数据库表字段,但是立马得到了领导的否决,经过多番查找后,这样做确实是有问题,就像类设计模式中提出的封闭原则,一个类确定好了之后,可以拓展但是不能修改,动态的DDL确实不好。经过多番查找后,网上有这么几种做法,记录一下...原创 2018-02-26 23:00:22 · 4977 阅读 · 3 评论