
mysql
文章平均质量分 54
qq_20009015
欢迎关注我的公众号《程序员与王子喵》
展开
-
使用forupdate解决并发冲突
任务场景:有一个主任务表,然后有个子任务表, 一个主任务对应多个子任务,当所有子任务完成的时候,需要去更新主任务表为完成状态。其中过程为,更新子任务,查询剩余子任务数量,如果剩余子任务数量为0,则更新主任务状态。并发问题就是:如果最后剩两个用户,他们提交子任务时后,去查询剩余子任务数量,因为开启了事务没有提交,所以他们查询到的数量都是1,然后就都不去update主任务了,这样最后子任务都完成了,但没有人来更新主任务了。解决方案:1.该项目如果是单机,就在该方法上加锁,syn锁。如果是分布式,原创 2020-05-10 21:22:14 · 870 阅读 · 0 评论 -
mysql笔记系列(二十七) 自增主键是自增但是不是连续的。
innodb的自增的值是存储内存中,每次重新启动之后,第一次打开表的时候,从里面取最大的id值+1作为下一次的自增值。mysql在8.0之后才有了将自增值持久化的能力,将自增值存到了redolog里面。自增不连续的原因:唯一键冲突是导致自增主键 id 不连续的第一种原因。先插入一个数据的时候,自增id为1,然后再次插入一个数据时,自增值为2,此时数据中某个唯一键冲突了,插入失败。如果再有...原创 2020-03-19 00:08:34 · 250 阅读 · 0 评论 -
mysql笔记系列(二十六) memory引擎和innodb引擎的区别
InnoDB 引擎把数据放在主键索引上,其他索引上保存的是主键 id。这种方式,我们称之为索引组织表(Index Organizied Table)。而 Memory 引擎采用的是把数据单独存放,索引上保存数据位置的数据组织形式,我们称之为堆组织表(Heap Organizied Table)。1.InnoDB 表的数据总是有序存放的,而内存表的数据就是按照写入顺序存放的;2.当数据文件...原创 2020-03-19 00:04:36 · 221 阅读 · 0 评论 -
mysql笔记系列(二十六) 临时表和union或groupby
1.内存表,指的是使用 Memory 引擎的表,建表语法是 create table … engine=memory。这种表的数据都保存在内存里,系统重启的时候会被清空,但是表 结构还在。2.临时表,可以使用各种引擎类型 。如果是使用 InnoDB 引擎或者 MyISAM 引擎的临 时表,写数据的时候是写到磁盘上的。当然,临时表也可以使用 Memory 引擎因此临时表不等于内存表。建表语法是...原创 2020-03-19 00:02:04 · 1114 阅读 · 0 评论 -
mysql笔记系列(二十五) join的原理和优化
join字段有索引的情况下Index Nested-Loop Join从驱动表(关联表) 取出一条数据,去被驱动表(被关联表)中查找在被驱动表中找到满足条件的数据,返回 作为结果集的一部分。重复以上,直到驱动表数据找完。驱动表是走全表扫描,而被驱动表是走树搜索。使用 join 语句,性能比强行拆成多个单表执行 SQL 语句的性能要好;如果使用 join 语句的话,需要让小表做驱动表...原创 2020-03-18 23:58:26 · 229 阅读 · 1 评论 -
mysql笔记系列(二十四)mysql查询内存分配
主机内存只有 100G,现在要对一个 200G 的大表做全 表扫描,会不会把数据库主机的内存用光了?答案是不会1.获取一行,写到 net_buffer 中。这块内存的大小是由参数 net_buffer_length 定义的, 默认是 16k。2.重复获取行,直到 net_buffer 写满,调用网络接口发出去。3.如果发送成功,就清空 net_buffer,然后继续取下一行,并写入 net...原创 2020-03-18 23:56:53 · 785 阅读 · 0 评论 -
mysql笔记系列(二十三)kill的意义
在 MySQL 中有两个 kill 命令:一个是 kill query + 线程 id,表示终止这个线程中正在执 行的语句;一个是 kill connection + 线程 id,这里 connection 可缺省,表示断开这个线 程的连接,当然如果这个线程有语句正在执行,也是要先停止正在执行的语句的kill query/connection 命令是有效的。比如,执行一个查询的过程 中,发...原创 2020-03-18 23:56:04 · 450 阅读 · 0 评论 -
mysql笔记系列(二十二)误删数据的处理
使用 delete 语句误删数据行;如果binlog是row模式,可以在binlog中恢复。需要确保binlog_format=row 和 binlog_row_image=FULL。使用 drop table 或者 truncate table 语句误删数据表;使用 drop database 语句误删数据库;2和3要恢复,只能用全量备份+增量日志的形式这个方案要求线上有...原创 2020-03-18 23:42:52 · 196 阅读 · 0 评论 -
mysql笔记系列(二十一)读写分离的问题
读写分离的主要目标就是分摊主库的压力两种方案1.客户端(client)主动做负载均 衡,这种模式下一般会把数据库的连接信息放在客户端的连接层。由客户端来选 择后端数据库进行查询客户端直连方案,因为少了一层 proxy 转发,所以查询性能稍微好一点儿,并且整体架 构简单,排查问题更方便。但是这种方案,由于要了解后端部署细节,所以在出现主备切换、库迁移等操作的时候,客户端都会感知到,并且需要调整...原创 2020-03-18 23:41:37 · 164 阅读 · 0 评论 -
mysql笔记系列(二十)mysql的主备一致
原理:写在主库的操作,从库会同步其binlog日志,将操作应用到从库上。从库设置成readonly 只读的,可以防止出现主从双写导致主从数据不一致。因为 readonly 设置对超级 (super) 权限用户是无效的,而用于同 步更新的线程,就拥有超级权限,不影响从库同步主库的操作。备库 B 跟主库 A 之间维持了一个长连接。主库 A 内部有一个线程,专门用于服务备库 B 的这个长连接。...原创 2020-03-18 23:40:37 · 164 阅读 · 0 评论 -
mysql笔记系列(十九)mysql如何保障数据不丢
1.binglog的写入机制事务执行过程中,先把日志写到 binlog cache事务 提交的时候,再把 binlog cache 写到 binlog 文件中一个事务的 binlog 是不能被拆开的,因此不论这个事务多大,也要确保一次性写入系统给 binlog cache 分配了一片内存,每个线程一个,参数 binlog_cache_size 用于控制 单个线程内 binlog cache...原创 2020-03-18 23:38:25 · 137 阅读 · 0 评论 -
mysql笔记系列(十八)幻读和间隙锁
幻读指的是一个事务在前后两次查询同一个范围的时候,后一次查询看到了前一次查询没有看到的行。在可重复读隔离级别下,普通的查询是快照读(使用事务版本确定了数据的可见性),是不会看到别的事务插入的数据的。因此,幻读在“当前读”下才会出现select xxx from xxx where c=5 for update 这种读 使用的是当前读幻读带来的问题:1.加锁的语义破坏,比如说事务A中 s...原创 2020-03-18 23:36:27 · 310 阅读 · 0 评论 -
mysql笔记系列(十七)sql执行慢的原因
1.等待表锁释放2.等待DML写锁释放使用show processlist可以看到连接的状态3.等待行锁释放4.undolog太多,也就是在查一张更新频繁的表,用一致性读的形式,可能需要经过许多个undolog推算。可以用加读锁的当前读,select xx from xx lock share mode。5.内存命中率低...原创 2020-03-18 23:35:03 · 183 阅读 · 0 评论 -
mysql笔记系列(十六)索引列失效的原因
列上加了索引,但是实际执行的时候依然很慢。1.索引列上加了函数t_modified列为索引where t_modified=‘2018-7-1’ 索引生效where month(t_modified)=7 索引无效首先,所有的函数都是在server层执行的,存储引擎只负责取数。因此,where month(t_modified)=7的过程是,先从存储引擎取出一个数,然后servic...原创 2020-03-18 23:33:39 · 415 阅读 · 1 评论 -
mysql笔记系列(十五)内存临时表和limit原理
19.内存临时表Extra 字段显示 Using temporary,表示的是需要使用临时表;Using filesort,表示的是 需要执行排序操作。同时存在的时候, Extra 的意思就是,需要临时表,并且需要在临时表上排序。使用内存表是需要将某次查询的结果存起来,然后再对这个内存表进行操作 。内存表在默认情况下, 如果小于16mb 是存在内存中的,如果大于16mb 就会被存到磁盘中。...原创 2020-03-18 23:32:24 · 617 阅读 · 0 评论 -
mysql笔记系列(十四)orderby的原理
语句:select city,name,age from t where city=‘杭州’ order by name limit 1000 ;city为普通索引列。用explain 命令查看执行计划的时候,可以在Extra字段看到 usingfilesort , 当出现这个的时候,就说明需要排序。mysql会给个线程分配一个内存用于排序,这个内存叫sort_buffer。排序是在ser...原创 2020-03-18 23:30:59 · 247 阅读 · 0 评论 -
mysql笔记系列(十三)崩溃恢复的时候判断原则
redolog保证了崩溃可以恢复,是通过两阶段提交协议保障的。先写redolog, 然后写binlog 最后提交redolog。1.如果中途崩溃了,那么如果假设binlog写完了,redolog写完了,但是没提交,那么就会提交这个redolog。2.如果中途崩溃了,那么如果假设binlog写完了,redolog没写完,就根据redolog里面xid去找binlog,如果能找到,说明binl...原创 2020-03-18 23:29:31 · 243 阅读 · 0 评论 -
mysql笔记系列(十二)count的执行过程
MyISAM 将一个表的总行数存在了磁盘里面,使用的时候直接读出来,很快。(如果有where 条件,就需要按行统计了,就不能那么快)innodb则是将数据一条条读出来统计,所以数据越多越慢。innodb这样设计是因为事务,事务的并发版本控制,一个事务中的查询,只能对看到自己事务隔离级别的数据,也就需要判断是否可见,就不能简单的直接存个总数在磁盘了。innodb统计的时候会选择尽可能小的索引...原创 2020-03-18 23:28:03 · 202 阅读 · 0 评论 -
mysql笔记系列(十一)数据库表空间的回收,表数据删掉一半,表文件大小不变
数据库表空间的回收,表数据删掉一半,表文件大小不变innodb里面表结构存在.frm里面,数据存在.ibd里面在删除表的时候 drop table命令 可以回收表空间,但是如果只是删除数据,那么表文件不会变小,同理删除索引也是,不会导致索引文件变小。因为删除只是逻辑删除,并没有真正的删掉文件,只是给数据打了失效标签。打了失效标签的空间,可以下次被复用,被新的数据覆盖。通过delete...原创 2020-03-18 23:26:36 · 410 阅读 · 0 评论 -
mysql笔记系列(十)sql执行突然变慢的原因
14.sql执行突然变慢的原因,有时候,一条语句执行很快,有时候又执行很慢。mysql在执行更新操作的时候,写磁盘的时候,是写的redolog和内存,写完就返回更新成功, 此时数据文件并没有被更新。内存数据和磁盘数据就不一致,这时候内存页也叫脏页,内存数据写入到磁盘之后,这个时候内存数据页就叫干净页,这个过程叫flush 。执行的很快的时候就是写内存和日志,执行的很慢的时候就是在flush...原创 2020-03-18 23:25:45 · 1591 阅读 · 0 评论 -
mysql笔记系列(九)mysql如何选择索引的
12.mysql如何选择索引的12.1 补充索引的知识:1.建立索引慢,删除索引快,是因为建立索引的时候生成索引文件,而且删除的时候是标记删除,相当于打了一个失效标记,所以快。2.执行器调用存储引擎的接口只能获取到原始的数据,后续的order join group 等都在server层进行,数据过滤除了索引下推之外,也是在server层进行。12.2 一张表可以有多个索引,具体选择哪个索引...原创 2020-03-18 23:24:46 · 378 阅读 · 0 评论 -
mysql笔记系列(八)阶段总结
1.分为server层和存储引擎层server层又划分为连接器,解析器,优化器,执行器,存储引擎层则是innodb或者myisam等不同的存储引擎。连接器管理连接,临时内存也是分配在连接对象上解析器 对sql进行词法解析 语法解析 ,验证sql的语法正确性优化器 确定使用哪个索引 连接的方式 等执行器 调存储引擎的接口取数据,同时对数据进行处理 比如说order by group ...原创 2020-03-18 23:23:12 · 181 阅读 · 0 评论 -
mysql笔记系列(七)唯一索引和普通索引的性能区别
普通索引和唯一索引,应该怎么选择?在innodb中每个页的大小为16kb,读一条记录时以页为单位读入内存。普通索引查找数据的时候,会将符合条件的都找出来唯一索引,只要找到第一条符合条件的,就会立刻返回,不再继续找了,因为唯一的约束已经事先确保了只有一条符合条件。但是对查询来说,以上两种 如果数据都只有1条,时间是相似的,微乎其微。change buffer 当更新一个数据页的时候,如果...原创 2020-03-09 01:34:40 · 728 阅读 · 0 评论 -
mysql笔记系列(六)事务隔离级别和mvcc
1.事务隔离级别和锁事务的启动begin/start transtanction 命令并不是一个事务的起点,要在执行到第一条对涉及表的操作的时候开开始。如果要立刻开始一个事务,命令是start transtaction whth consistent snapshot 。也就是第一种方式:事务的一致性视图是在第一个快照读语句时创建的第二种方式:是在命令start transtact...原创 2020-03-08 22:33:03 · 177 阅读 · 0 评论 -
mysql笔记系列(五)全局锁,表锁,行锁
数据库的锁分为 全局锁,表级锁,行锁1.1 全局锁就是给整个数据库加锁,mysql提供了一个命令为 flush tables with read lock ,使用后 整个库都将处于只读状态其他线程的 数据更新操作(增删改), 数据定义语句(建表,修改表结构) 和更新类事务的提交语句 都阻塞。全局锁的场景:做全库逻辑备份,也就是将数据库的数据导出进行备份,这个期间不能让其他新的数据和...原创 2020-03-08 22:31:47 · 200 阅读 · 0 评论 -
mysql笔记系列(四)索引和B树,B+树
1.索引索引相当于数据的目录,用于加快搜索效率。1.1 索引的数据结构适合用来做索引的数据结构:1.hashkey-value的形式,将key通过hash算法得到一个数字,然后将值存到这个数字下标的数组中,如果该位置已经有数据存在,则往后面挂一个链表。优点是查询快,查找的时候只要计算key的hash值就可以定位到数据的位置。适合NoSql数据库 比如说redis对等值查询非常友好,...原创 2020-03-08 22:30:05 · 193 阅读 · 0 评论 -
mysql笔记系列(三)事务特性和隔离级别
1.事务事务是要保证一组数据库操作,要么全部成功 要么全部失败,事务支持是在存储引擎层面实现的,myIsAM是不支持事务的,InnoDB支持事务。事务的四大特性:原子性: 一个事务本身是一个不可分割的最小单元,一组操作,要么全部执行,要么全部不执行,因此需要支持回滚 ,比如执行到某个sql出了异常,那么就回滚之前的所有的操作。一致性: 状态必须从一个一致性状态 转移到另一个一致性状态,不能...原创 2020-03-08 22:28:20 · 163 阅读 · 0 评论 -
mysql笔记系列(二)mysql更新和日志
1.日志文件(和更新息息相关)redo log (重做日志)和bin log (归档日志) ,这两个是在sql进行更新的时候必定会涉及的。mysql里面的wal技术 write-ahead logging ,先写磁盘日志 , 再写磁盘数据文件 。也就是 innodB引擎,会先把更新写入到redo log里面,然后更新内容,等系统空闲的时候,再慢慢把redo log里面的内容 整理到磁盘数据文...原创 2020-03-08 22:25:59 · 383 阅读 · 0 评论 -
mysql笔记系列(一)mysql的组件剖析
1.mysql可以分为 server层和存储引擎两层service层完成连接,查询缓存,分析器,优化器,执行器 以及各种函数,和所有跨存储引擎实现的功能 比如说触发器,触发器,存储过程,视图等。存储引擎负责数据的存储和提取,其架构模式是插件式的,支持innoDB MyISAM Memory等 ,innoDB在5.5以后为默认的。2.连接长连接为建立之后,客户端如果持续有请求,就一直使用这个...原创 2020-03-08 22:24:57 · 254 阅读 · 2 评论 -
mysql中一条sql执行流程
原创 2020-01-15 22:41:24 · 257 阅读 · 1 评论 -
mysql的锁机制和事务的总结(上)
首先明白一个问题:锁存在的意义, 在数据库中,数据是一种供多个用户使用的共享资源。既然是共享资源,那么多个用户在同一时间访问和修改,必然会发生并发访问带来的问题。 所谓并发访问的问题就是如何保证数据的有效性,正确性。例如说 ,表中有如下记录idname数量1橘子200有两个用户A和B用户A想要将当前数量减10用户B想要将当前数量减去20u...原创 2020-01-06 01:51:37 · 231 阅读 · 1 评论 -
mysql的悲观锁select ... for update
select ... for update 给select 查询范围内的记录加排它锁,其他对这些记录的更新 删除操作 和select … for update 操作 都将阻塞,直到该语句的事务结束。例如select * from t_item_detail where id='9998988' for UPDATE;其作用为给id为9998988的行记录加锁,使用方式为 在事务中使用以达到...原创 2020-01-02 20:56:21 · 549 阅读 · 2 评论 -
mysql事务和锁超时异常lock wailt timeout exceeded
当两个事务中,都会同一行记录进行操作的时候,可能会触发死锁,最终抛出超时异常验证如下首先在当前的数据库连接会话中将数据库事务设置为手动提交set @@autocommit=0;SHOW VARIABLES like ‘%autocommit%’然后在当前会话中执行, 但先不commit这个时候在该会话中,事务还没提交此时在该会话中去查询数据已经看不到了。但是此时在另一...原创 2019-12-31 19:47:30 · 727 阅读 · 0 评论 -
mysql踩坑之唯一键可以为nul
《Effective MySQL之SQL语句最优化》(Ronald Bradford著,李雪峰译)。有句”唯一键可以包含NULL值,并且每个NULL值都是唯一的(即NULL!=NULL)但是查询出来结果依赖有多个为null并非是下意识认为的null只有一个!尝试插入了唯一键为null的数据,仍然可以正常插入因此,设置了唯一键的列,强烈建议设置非空约束...原创 2019-12-02 17:30:09 · 475 阅读 · 0 评论 -
mysql查找连续出现n次以上的数
id连续的,因此三表关联查询select distinct(l1.num) as ConsecutiveNums from Logs l1,Logs l2,Logs l3where l1.id=l2.id-1 and l1.id=l3.id-2 and l1.num=l2.num and l1.num =l3.num方法二,利用自定义变量进行分组 ,将连续的值都分到一个组里面,...原创 2019-12-02 01:54:35 · 2610 阅读 · 0 评论 -
员工薪水中位数
先用自定义变量分组排序,定义@num为序号,初始化为0,定义@last为上一行的部门,定义为null,然后进行查询,@num:=if(@last!=Company,@num:=1,@num:=@num+1) 如果上一家公司不等于现在这家公司,就重置num为1,否则增加1注意 需要先按公司排序 ,不然公司是乱的 序号就会不准此时 这一步的时候,就得到了按分组排好序的数据select Id,C...原创 2019-12-01 22:16:02 · 1159 阅读 · 0 评论 -
mysql组内排序(部门工资前三高的所有员工)
两种解法 子查询和分组序号1.分组序号,思路:表关联查询,先按部门分组,按工资排序。select d.name as Department,e.name as Employee,Salary from Employee e join Department d on e.DepartmentId=d.id group by DepartmentId,e.id order by D...原创 2019-12-01 20:13:17 · 1544 阅读 · 0 评论 -
sql查询结果保留2位小数
select convert(ifnull(count(distinct requester_id, accepter_id)/count(distinct sender_id, send_to_id) ,0.0),decimal(10,2)) as accept_rate from request_accepted ,friend_requestconvert()函数会对小数部分进行四舍五入...原创 2019-12-01 00:36:22 · 7659 阅读 · 0 评论 -
mysql给列加序号
select @row_id:=@row_id+1 as ID,a.America from (select name as America from student where continent='America' order by America asc) a ,(select @row_id:=0) b 1.首先定义一个变量并初始化为0。 @row_id:=0定...原创 2019-12-01 00:03:32 · 871 阅读 · 0 评论 -
mac下安装mysql
除了常规用安装包安装的方法之外 还有一种推荐的安装方法brew doctor确认brew在正常工作。brew update更新包。 brew install mysql 安装mysql。brew install mysql 这样就是安装成功了 接下来是启动学会使用brew info 软件名来查看提示 可以看到如下命令提示 To connec...原创 2018-11-30 12:52:26 · 920 阅读 · 0 评论