mysql
雪落南城
这一场人间流浪,长随步履温柔相候
展开
-
分享一个数据库语句解析进阶版语句--- explain extended
explain extended关键字原创 2023-02-20 09:37:36 · 156 阅读 · 0 评论 -
数据库连接
数据库当前连接查看show processlist;Id: 就是这个线程的唯一标识,当我们发现这个线程有问题的时候,可以通过 kill 命令,加上这个Id值将这个线程杀掉。前面我们说了show processlist 显示的信息时来自information_schema.processlist 表,所以这个Id就是这个表的主键。User: 就是指启动这个线程的用户。Host: 记录了发送请求的客户端的 IP 和 端口号。通过这些信息在排查问题的时候,我们可以定位到是哪个客户端的哪个进程发送的请求。原创 2021-07-01 17:20:24 · 187 阅读 · 0 评论 -
慢查询治理思路
一、背景sql出现慢查询时,导致整个接口响应时间变长,继而影响整个链路的耗时,甚至接口被流控/熔断;一个慢查询引发的事故:•SQL语句: delete from xx_orderwhere order_id = ?• 损失⽀付订单数10万+•直接原因:由于order_id未建索引,delete操作会锁表并全表扫描•影响链路:慢查询 -> 连接池打满 -> 超时异常 -> 操作失败 -> ⽤户不断重试 -> 压⼒剧增二、理论复习1、硬件访问速度CPU >原创 2021-05-28 16:51:38 · 317 阅读 · 0 评论 -
记一次数据库异常导致业务端线程全block住
背景:业务A的数据库某个实例异常,操作下线后再上线,业务A线程被打满无法处理新请求原创 2021-05-28 12:05:08 · 173 阅读 · 0 评论 -
数据库update更新返回更新条数
设置属性useAffectedRows=true默认:falseuseAffectedRows=false时,返回update语句where扫到的行数useAffectedRows=true时,返回update语句真正更新的行数原创 2021-04-25 20:52:56 · 1794 阅读 · 0 评论 -
为什么分表时推荐数量为2的N次方?
近日架构升级,在讨论分表的问题,提议将原来的100张分表设为128张,深以为然,本来以为只是个面试题,没想到真的会用实战中了。那么问题来了,为什么要使用2的N次方张表呢?1、定位速度更快我们分表后,增改查数据时,需要有一定的业务逻辑将数据定位到某一张分表中,比如使用订单号后四位 对表的总数进行取余,然后定位到某一张表。此时大家是不是能够联想到hashMap对key定位的优化?没错 就是将数组的容量置为2的N次方,此时取余运算可以转换为 位运算(n - 1) & hash,速度更快这样我们原创 2021-04-09 10:17:46 · 2924 阅读 · 0 评论 -
关于分布式服务单元化的思考
通常我们说服务架构的演进一般为:单体架构 -> 分布式架构随着业务量级的发展,不同方向的服务通过加机器来承担更大的流量服务抗住了,数据库又扛不住了我们又开始加缓存,分库分表如此看来可以通过无限的分库分表来承担无限的流量实际上并非如此。对于服务A来说,假设有3台机器,数据库分了3个,那么调用如下每个库承担了所有实例的请求,也就是说服务的实例并不能无限的扩展,因为数据库承受不住压力;那么这种情况怎么办呢?“单元化”说的直白一点就是,实例1访问属于它的数据库,不访问数据库2,3;原创 2021-04-07 17:15:10 · 1115 阅读 · 1 评论 -
Mybatis insert时结果返回1,字段都是0
今天在构建新项目,测试mybatis时,出现了如题的casemybatis-config文件新增查看执行的SQL发现执行的SQL是没有问题的原创 2021-03-01 21:01:25 · 1194 阅读 · 1 评论 -
mysql实现分组组内排序?实现rownumber()功能
众所周知,Oracle和SQL server支持分组组内排序,语法为row_number() over (partition by col1 order by col2),表示根据col1分组,在分组内部根据col2排序可以参考:https://www.cnblogs.com/starzy/p/11146156.html示例:select id,row_number() over (partition by id order by partner_id DESC) rankfrom table_原创 2020-12-20 12:50:15 · 1080 阅读 · 1 评论 -
MySQL驱动表和被驱动表的一些思考
最近在做SQL优化中,把传统分页limit offset,size转变成内连接查询id实现,具体可见上一篇博文关于内连接的SQL,同事提出了一些疑问,哪张表是驱动表?放在前边的吗?针对这个问题,查了查相关资料这里先放结论(这个结论没有考虑join的时候on的条件对结果的影响,实践中给出了一些参考):1、当连接查询没有where条件时,左连接查询时,前面的表是驱动表,后面的表是被驱动表;右连接查询时相反,前面的表是被驱动表,后面的表是驱动表;内连接查询时,哪张表的数据较少,哪张表就是驱动表2、原创 2020-11-25 14:49:10 · 1420 阅读 · 0 评论 -
分页查询优化
前端界面通常会展示第N页,每次点击显示当页的数据,这个分页能力由后端提供,前端提供页号和每页的数据量到达后端转换为 limit (pageNum-1)*PageSize,PageSize然而这个使用是有问题的:阿里规范中:MySQL并不是跳过offset行,而是取offset+N行,然后返回放弃前offset行,返回N行,那当offset特别大的时候,效率就非常的低下,要么控制返回的总页数,要么对超过特定阈值的页数进行SQL改写。正例:先快速定位需要获取的id段,然后再关联:SELECT a.*原创 2020-11-24 18:00:28 · 423 阅读 · 0 评论 -
MySQL主从同步原理图
上图mysql主从复制需要三个线程:master(binlog dump thread)、slave(I/O thread 、SQL thread)binlog dump线程:主库中有数据更新时,根据设置的binlog格式,将更新的事件类型写入到主库的binlog文件中,并创建log dump线程通知slave有数据更新。当I/O线程请求日志内容时,将此时的binlog名称和当前更新的位置同时传给slave的I/O线程。I/O线程:该线程会连接到master,向log dump线程请求一份指定bin原创 2020-11-18 14:48:21 · 769 阅读 · 0 评论 -
MySQL执行计划-EXPLAIN浅析
as all we know,我们使用explain来分析一个sql执行时会用到哪些索引之类的情况形如:今天我们简单说一下执行计划里的type我们定义一个表create table test (`id` int not null auto_increment,`a` int not null,`b` int not null,`c` int not null,`d` int not null,`e` int not null,primary key(`id`),UNIQUE KEY原创 2020-11-08 01:30:02 · 285 阅读 · 0 评论 -
MySQL索引合并:单条SQL使用多个索引
一直以为每条查询语句只会使用到一个索引,其实不然早在mysql5.1版本就已经支持索引合并了。还是线上出了慢查询才知道- -~什么是索引合并?所以合并是利用表上的多个单列索引来定位指定行,其原理是将对每个索引的扫描结果做运算,总共有:交集、并集以及他们的组合,但是索引合并并非是一种合适的选择,因为在做索引合并时可能会消耗大量的CPU和内存资源,一般用到索引合并的情况也从侧面反映了该表的索引需要优化,可以尝试建立联合索引。怎么确定使用了索引合并呢?在使用explain对sql语句进行操作时,如果使用原创 2020-11-06 01:18:47 · 1889 阅读 · 0 评论 -
RR隔离级别原理
1、首先了解undo log的版本链模式我们每条数据其实都有两个隐藏字段,一个是trx_id,一个是roll_pointer,这个trx_id就是最近一次更新这条数据的事务id,roll_pointer就是指向你了你更新这个事务之前生成的undo log多个事务串行执行的时候,每个人修改了一行数据,都会更新隐藏字段txr_id和roll_pointer,同时之前多个数据快照对应的undo log,会通过roll_pinter指针串联起来,形成一个重要的版本链!2、ReadView机制这个ReadVi原创 2020-11-03 16:45:49 · 1031 阅读 · 0 评论 -
mysql数据收发流程
当client处理太慢阻塞住server时,server端状态为"sending to client";当查询开始的时候,server端状态为"sending data";原创 2020-10-09 10:13:56 · 316 阅读 · 0 评论 -
MySQL加锁规则
加锁规则里面,包含了两个“原则”、两个“优化”和一个“bug”。原则 1:加锁的基本单位是 next-key lock。希望你还记得,next-key lock 是前开后闭区间。原则 2:查找过程中访问到的对象才会加锁。优化 1:索引上的等值查询,给唯一索引加锁的时候,next-key lock 退化为行锁。优化 2:索引上的等值查询,向右遍历时且最后一个值不满足等值条件的时候,next-key lock 退化为间隙锁。一个 bug:唯一索引上的范围查询会访问到不满足条件的第一个值为止。...原创 2020-09-18 09:54:02 · 444 阅读 · 0 评论 -
binlog格式
1、row2、statement3、mix原创 2020-07-31 09:58:12 · 186 阅读 · 0 评论 -
mysql-行溢出
innodb中一页的大小是 16KB一行数据最大可以为 65535B = 64KB所以说,存在一页存不下一行数据的情况成为行溢出对于行溢出,解决方案方案一:每一页存行的部分数据 + 下一页地址方案二:第一页不存数据 只存下一页地址...原创 2020-08-29 20:40:45 · 262 阅读 · 0 评论 -
关于可重复读与幻读的一点思考
首先声明~可重复读是隔离级别,幻读是这个隔离级别下出现的问题。含义可重复读是指 在修改删除的前提下,同一个事务中,执行的查询结果是一致的举个栗子:时间线事务1事务21开启事务2查询数据A3开启事务4更新数据A5提交事务6查询数据A对于事务1,两次查询的结果应该是一致,无论事务2是更新了数据A还是删除了数据A幻读个人理解,在新增的前提下,同一个事务查询和插入的预期结果不一致,查询没有,但是插入会报错时原创 2020-07-14 13:11:06 · 961 阅读 · 0 评论 -
mysql中int(a)、bigint(20)中括号里的数字含义?
一开始我以为int(a),bigint(20)括号中的数字是限制存储的长度,和char(50)一样这是错误的!实际上,对于int,bigint来说,无论括号中的数字是多少,都不会影响这个字段存储的最大长度括号中的数字表示的是显示的最低位数,填充的字符长度小于括号中的值时,会自动填充,举个栗子:partner_id int(11) zerofill NOT NULL COMMENT ‘’;当demo_id设为 10时,显示的值为00000000010当然,这个特性需要结合zerofill使用,原创 2020-07-06 18:01:27 · 3265 阅读 · 1 评论 -
一条SQL更新语句的过程
首先流程图和查询时基本一致与查询流程不一样的是,更新流程还涉及两个重要的日志模块,它们正是我们今天要讨论的主角:redo log(重做日志)和 binlog(归档日志)。如果接触 MySQL,那这两个词肯定是绕不过的,我后面的内容里也会不断地和你强调。不过话说回来,redo log 和 binlog 在设计上有很多有意思的地方,这些设计思路也可以用到你自己的程序里...原创 2020-07-05 12:50:31 · 248 阅读 · 0 评论 -
一条查询语句的具体执行过程
参考链接:面试官:你来讲讲一条查询语句的具体执行过程执行过程图各名词含义连接器当客户端连接 MySQL 时,会发出连接请求到连接器,连接器此时就会去验证这个连接的账号密码如果账号或者密码不正确,客户端就会收到一个 Access denied for user 的错误,之后此次连接结束账号密码正确,连接器会到权限表里面查询出该账号所拥有的权限,之后这个连接里面的权限判断,都是以此时读到的权限为根据所以你知道为什么更改了一个账号的权限之后,一定要断开再重连才有效吧~在实际中肯定有这样的情况,就原创 2020-07-04 22:48:23 · 699 阅读 · 0 评论 -
innodb的聚簇索引会存两份数据吗
众所周知,innodb引擎下的一级索引和二级索引,二级索引叶子节点存的是id,一级索引是以id建立的索引,叶子节点存的是那一行的数据那么,是不是每行数据都被存了两遍呢(数据本身,一级索引再存一遍)?当然不是,一级索引建立在数据本身上的。如果建表时没有指定一个主键,mysql会使用表中的整形唯一索引做主键,如果还没有,则mysql创建一个自增主键。mysql建表不指定主键怎么办...原创 2020-05-13 20:21:01 · 429 阅读 · 0 评论 -
MySQL锁相关
mysql锁分类表锁、页锁、行锁innodb主要是行锁、其次表锁innodb 增删改会加锁,读取不加锁通过MVCC机制innodb中行锁分为共享锁(S)和排他锁(X)共享锁:多个事务都可以对同一行加共享锁来进行读,但其他事务不能写这一行排他锁:一个事务加锁后可以写这一行,别的事务只能读不能写共享锁需要手动加,select * from table where id=1 lock ...原创 2020-03-11 00:42:58 · 295 阅读 · 0 评论 -
MySQL事务相关,隔离级别等
事务的特性ACID1、atomic 原子性2、consistency 一致性3、isolation 隔离性4、durability 持久性数据库隔离级别1、读未提交 read uncommitted2、读已提交 read committed3、可重复读 read repeatable4、序列化不同隔离级别导致的问题隔离级别脏读不可重复读幻读读未提交...原创 2020-03-11 00:04:50 · 163 阅读 · 0 评论 -
MySQL的存储引擎比较(MyISAM和InnoDB)
存储引擎简介场景特点InnoDBInnoDB是Inno Database的缩写。Innobase Oy是芬兰的一家公司,InnoDB其实就是以公司名命名的了分布式系统,需要事务等场景支持事务MyISAMISAM是Indexed Sequential Access Method (有索引的顺序访问方法) 的缩写,它是存储记录和文件的标准方法。不是事务安全的,而且...原创 2020-03-10 21:55:09 · 309 阅读 · 0 评论 -
windows打开mysql服务
本机安装了mysql,许久没用今天想用一下的时候 发现打不开mysql的服务看了网上的说法:1、net start mysql ----无效于是考虑到可能之前禁用了mysql的开机自启打开任务管理器 - 服务-找到 MySQL57 右击启动 即可!...原创 2019-11-18 23:08:08 · 1497 阅读 · 0 评论 -
Kafka-构建数据管道,从MySQL到ElasticSearch
参考书籍 《Kafka权威指南》1、环境配置及程序安装2、从MySQL 到 Kafka3、从Kafka到ElasticSearch原创 2019-11-11 11:00:36 · 228 阅读 · 0 评论 -
代码执行顺序和数据库更新时间不一致
场景:某业务代码逻辑如下1、更新TABLE1 (方法加了@Transactional注解)2、更新TABLE23、发送kafka通知topicA4、Listener监听topicA5、Listener查询TABLE1问题:1、TABLE2 更新时间早于 TABLE12、Listener查询TABLE1时没有查询到数据,但后期再查就可以查到=======...原创 2019-11-04 16:21:19 · 330 阅读 · 0 评论 -
MySQL强制使用索引
SELECT *FROMtable_nameFORCE INDEX (`index_name`)WHERE示例explainselect *from pl_repayment_plan_user u#FORCE INDEX (`INDEX_REALPAYMENT`)where u.real_repay_time > '2018-10-31 16:5...原创 2019-10-31 17:05:27 · 14371 阅读 · 0 评论 -
关于group by的感想
SELECT O.`order_id` orderId, O.`type` businessType, datediff(now(), min(pu.should_repay_time)) days,UF.`NAME` userName, UF.`MOBILE` mobile,CL.`NAME` channelName, DATE_FORMAT(min(pu.should_repay_time...原创 2019-08-22 19:31:34 · 269 阅读 · 0 评论 -
Mybatis插入时获取自增主键
bean:@Datapublic class ConfigRepayDO { private Integer id;}mapper:<insert id="insert" parameterType="net.wecash.postloan.ruleconfig.orm.entity.ConfigRepayDO" useGeneratedKeys="tr...原创 2019-07-03 11:33:20 · 143 阅读 · 0 评论 -
Error querying database. Cause: java.lang.NumberFormatException: For input string: xx
这是由于mybatis参数格式化异常导致,例如在动态sql拼接中String类型参数和数字比较。 <if test="param.xxx!= '2'">其中xxx为String类型,加单引号mybatis会认为String和char比较,也会导致报错解决方法用toString()转成字符串,'2'.toString() 改为双引号"2",外层使用单引号。 &...原创 2019-03-25 11:41:49 · 1127 阅读 · 0 评论 -
MySQL查询数据的长度,指定指定列数据的长度
select idfrom awherelength(aa) > 8;有的情况下需要根据某个字段的长度做区分原创 2019-03-14 11:49:31 · 6040 阅读 · 0 评论 -
MySQL 删除列时会同时删除索引
https://dev.mysql.com/doc/refman/5.6/en/alter-table.html#alter-table-add-drop-column源文档如下Adding and Dropping ColumnsUseADDto add new columns to a table, andDROPto remove existing columns.DR...翻译 2019-03-04 12:19:35 · 2062 阅读 · 0 评论 -
mysql limit offset
offset 从零开始select * from student limit 9;示例中没有4 - -1、select * from student limit 9,4;查出9条,取这九条之后的4条数据2、select * from student limit 9 offset 4;从offset=4的数据开始取9条...原创 2019-01-18 15:41:35 · 232 阅读 · 0 评论