MySQL
文章平均质量分 82
程序新视界
个人公众号【程序新视界】,一个硬技术,软实力同步提升的平台。《Spring Boo技术内幕:架构设计与实现原理》作者,《深入以太坊智能合约开发》联合作者之一。主要从事于三方支付行业。
展开
-
select for update是行锁还是表锁,还真得看情况
对于软件或框架来说,特别是在有大版本更新的情况下,脱离了具体版本的结论往往是无意义的。此时,数据库一共加了8把锁,一把表级别的IX意向排他锁,6把基于主键的针对数据记录(总共6条)的X锁,一把针对记录的supremum pseudo-record锁。通过上面的结论,我们可以看出,并不是简单的说“有索引就是行锁,无索引就是表锁”,因为在事务隔离级别为RC时,无索引,同样表现(被优化)为行锁。此时,可以看到四把锁,一把表级别的IX锁,一把基于普通索引的X排他锁,一把基于主键的行级排他锁,一把基于普通索引的。原创 2023-01-16 09:39:31 · 2868 阅读 · 2 评论 -
突发状况,数据库表被锁,抓瞎了?
背景在程序员的职业生涯中,总会遇到数据库表被锁的情况,前些天就又撞见一次。由于业务突发需求,各个部门都在批量操作、导出数据,而数据库又未做读写分离,结果就是:数据库的某张表被锁了!用户反馈系统部分功能无法使用,紧急排查,定位是数据库表被锁,然后进行紧急处理。这篇文章给大家讲讲遇到类似紧急状况的排查及解决过程,建议点赞收藏,以备不时之需。故障追踪用户反馈某功能页面报502错误,于是第一时间看服务是否正常,数据库是否正常。在控制台看到数据库CPU飙升,堆积大量未提交事务,部分事务已经阻塞了很长时间,基本原创 2022-05-12 07:15:27 · 1131 阅读 · 0 评论 -
Mybatis的where标签,还有这么多知识点
背景在上篇文章,我们系统地学习了where 1=1 相关的知识点,大家可以回看《不要再用where 1=1了!有更好的写法!》这篇文章。文章中涉及到了Mybatis的替代方案,有好学的朋友在评论区有朋友问了基于Mybatis写法的问题。于是,就有了这篇文章。本篇文章会将Mybatis中where标签的基本使用形式、小技巧以及容易踩到的坑进行总结梳理,方便大家更好地实践运用d原始的手动拼接在不使用Mybatis的where标签时,我们通常是根据查询条件进行手动拼接,也就是用到了上面提到的where 1原创 2022-03-03 07:01:58 · 4972 阅读 · 2 评论 -
不要再用where 1=1了,有更好的写法
背景刚入行的同学,看到在SQL语句中出现where 1 = 1这样的条件可能会有所困惑,而长时间这样使用的朋友可能又习以为常。那么,你是否还记得当初为什么要这样写?是否有性能问题?有没有更好的写法?今天这篇文章,带大家从头到尾梳理一下where 1 = 1的使用及改进,或许你能从中得到更多意想不到的收获。where 1=1的作用如果要问在SQL语句的where条件中多加1=1目的是什么,很简单:使得where条件语句永远为真。本质上就是虽然加了where条件,但实际上永远为真,也就相当于没有加任何原创 2022-03-01 07:55:44 · 6233 阅读 · 12 评论 -
15个必知的Mysql索引失效场景,别再踩坑了
背景无论你是技术大佬,还是刚入行的小白,时不时都会踩到Mysql数据库不走索引的坑。常见的现象就是:明明在字段上添加了索引,但却并未生效。前些天就遇到一个稍微特殊的场景,同一条SQL语句,在某些参数下生效,在某些参数下不生效,这是为什么呢?另外,无论是面试或是日常,Mysql索引失效的通常情况都应该了解和学习。为了方便学习和记忆,这篇文件将常见的15种不走索引情况进行汇总,并以实例展示,帮助大家更好地避免踩坑。建议收藏,以备不时之需。数据库及索引准备创建表结构为了逐项验证索引的使用情况,我们先原创 2022-02-28 09:13:26 · 4094 阅读 · 2 评论 -
Mysql查询条件为大于时,不走索引失效问题排查
我们都知道在数据库查询时,索引可以极大的提高查询效率。通常在使用的时候,都会针对频繁查询的关键字段建立索引。比如,当以交易日期(trans_date)来查询交易记录时,通常会对该字段添加索引,以便在大量数据的情况下提升查询效率。针对trans_date字段,创建union_idx_query索引,那么在下面以trans_date为查询条件的语句中,毫无疑问是会走索引的:select count(1) from A; // 40000EXPLAIN select * from A where tra原创 2022-02-24 09:45:21 · 9201 阅读 · 2 评论 -
Mysql时间范围查询不走索引问题
使用Mysql进行数据查询时,如果在SQL语句中出现范围查询,类似如下语句:select * from logs where create_time >= '2020-01-01' ;此时,虽然在create_time字段上添加了索引,但是否会走索引还需要看数据量的情况。如果根据查询条件查询到数据的结果数量小于总数量的五分之一,则会走索引,否则会走全表扫描。因此,在进行范围查询时,比如>、< 、>=、<=等,如果数据量过大的话where语句的条件虽然添加了索引,但也有原创 2022-02-22 17:28:54 · 7543 阅读 · 0 评论 -
数据库时间慢了14个小时,Mybatis说,这个锅我不背~
同事反馈一个问题:Mybatis插入数据库的时间是昨天的,是不是因为生成Mybatis逆向工程生成的代码有问题?大家都知道,对于这类Bug本人是很感兴趣的。直觉告诉我,应该不是Mybatis的Bug,很可能是时区的问题。很好,今天又可以带大家一起来排查Bug了,看看从这次的Bug排查中你能Get什么技能。这次研究的问题有点深奥,但结论很重要。Let’s go!问题猜想同事反馈问题的时候,带了自己的猜想:是不是数据库字段设置为datetime导致?是不是Mybatis逆向工程生成的代码中类型不一致导原创 2021-11-27 08:50:15 · 1148 阅读 · 0 评论 -
隐藏了2年的Bug,终于连根拔起,悲观锁并没有那么简单
接手的新项目,接二连三的出现账不平的问题,作为程序员中比较执着的人,不解决誓不罢休。最终,经过两次,历时多日终于将其连根拔起。实属不易,特写篇文章记录一下。文章中不仅会讲到使用悲观锁踩到的坑,以及本人是如何排查问题的,某些思路和方法或许能对大家有所帮助。事情的起源运营同事时不时就提出查账调账的需求,原因很简单,账不平,不查不行。如果你有过财务相关系统的工作经历,账务问题始终是最难攻克的。虽然刚接手项目,虽然很多业务逻辑还不了解,但出现这样的技术挑战,还是要坚决攻克的。其实,这类问题的原因很简单:热原创 2021-11-21 15:44:20 · 9975 阅读 · 42 评论 -
不懂Mysql排序的特性,加班到12点,认了认了
小弟新写了一个功能,自测和测试环境测试都没问题,但在生产环境会出现偶发问题。于是,加班到12点一直排查问题,终于定位了的问题原因:Mysql Limit查询优化导致。现抽象出问题模型及解决方案,分析给大家,避免大家踩坑。问题场景新上线一个交易记录导出功能,逻辑很简单:根据查询条件,导出对应的数据。由于数据量比较大,在查询数据库时采用了分页查询,每次查询1000条数据。自测正常,测试环境正常,上线之后运营反馈导出的数据有重复记录。原本是以为业务逻辑问题,重新Review了一遍代码,依旧未找到问题原因。原创 2021-10-29 07:08:00 · 734 阅读 · 4 评论 -
数据库的几种日期时间类型,你真的会用吗?
日期和时间是每个系统,每个数据库设计必不可少的部分。也是容易被大家忽视的部分。很多开发者可能根本不了解以不同类型存储日期和时间意味着什么。有朋友可能会说,数据库定义一个datetime或timestamp类型的字段,然后在Java代码中获取当前时间并存入数据库不就可以了吗?Date now = new Date();// 调用insert或update方法创建或更新日期字段。最近设计新系统的数据库,涉及到跨时区的问题,于是专门调研了不同日期时间类型的利弊,也咨询了不少同行使用的情况。这里分享给大家原创 2020-05-20 13:34:13 · 15653 阅读 · 0 评论 -
mysql更新字段中的部分内容
在实践中,会出现某些字段中的内容变了,比如三方提供的图标地址变了,那么或许对字段中存储的图片域名进行更新,此时就需要用到mysql更新字段中的部分内容的功能。基本更新语句如下:update table set icon = REPLACE(icon,'http://a.com','http://b.com');其中table便为对应的表明,icon为要更新的字段,REPLACE中第二个参数为将要被替换的内容,第三个字段为替换成的新内容。...原创 2020-05-13 11:20:49 · 1803 阅读 · 1 评论 -
最好用的Mysql数据库客户端Sequel Pro使用及崩溃解决方案
今天给大家推荐一款我用了多年,感觉非常好用的Mysql客户端——Sequel Pro,开源客户端,目前只有Mac版本。推荐这款软件的原因很简单,就是最近用它连接Mysql 8时直接崩溃,通过各种途径终于找到解决方案了。没有了崩溃的bug,才更值得推荐。下面就来简单了解一下这款软件的功能吧。软件简介首先来看连接的操作界面:左边列表是存储的建立好的数据库连接配置,单击便会显示右边的连接配置...原创 2020-03-29 17:09:10 · 6856 阅读 · 6 评论 -
Mysql连接数据库异常汇总【必收藏】
在Centos上部署项目发现一个奇怪的问题,数据库连接一直抛异常。于是花了两个小时搜了各种数据库连接异常导致的原因,最终问题得以解决。同时,把解决过程中搜集到的异常信息汇总一下,当大家遇到类似的问题时,给大家以思路。必须珍藏。问题现象先来说说我遇到的问题。项目中遇到的问题很奇怪,在Centos上安装了Mysql数据库,项目使用的是Spring Boot。项目在本地启动连接服务器数据库正常、本...原创 2020-03-22 09:34:24 · 2974 阅读 · 0 评论 -
JDBC简介及实例
关于JDBC在早些年的面试过程中,经常会让手写JDBC代码,但随着ORM框架的发展,关于手写JDBC代码的面试题越来越少,但这并不等于JDBC的没落。在此种情况下更好的理解JDBC,反而更有利于理解当前ORM框的优势所在。因为,JDBC它本身只是一个规范。JDBC简介Java数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何...原创 2020-03-03 20:02:40 · 981 阅读 · 0 评论 -
MySQL笔记——主键使用的好习惯
几个普遍认可的关于MySQL主键的好习惯不更新主键列中的值;不重用主键列的值;不在主键列中使用可能会更改的值。——《MySQL必知必会》读书笔记原创 2016-02-26 18:12:54 · 1234 阅读 · 0 评论 -
mysql表区分大小配置
Linux区分大小写规则数据库名与表名严格区分大小写;表的别名严格区分大小写;列名与列的别名忽略大小写;变量名严格区分大小写; windows下均不区分大小写。配置支持大小写Linux下配置my.cnf文件来决定是否支持大小写。默认支持区分大小写,即等同于配置:lower_case_table_names=0不区分大小写配置成如下即可:lower_case_table_names=1一般原创 2016-09-13 14:29:44 · 1180 阅读 · 0 评论 -
mysql命令创建数据库库名特殊字符
问题场景在使用mysql命令进行数据库创建时,发现“-”等特殊字符无法使用,提示sql语句语法错误。mysql> CREATE DATABASE `test-test`;解决方案使用反引号“,即英文输入法下,数字1左边,和“~”同一个按键上的符号,可正常执行。mysql> CREATE DATABASE `test-test`;Query OK, 1 row affected (0.00 sec)原创 2016-08-23 13:10:05 · 7798 阅读 · 0 评论 -
Linux下实现Mysql定时任务备份数据
创建备份目录本实例将创建目录放置于/mnt目录下,可根据具体情况放置于其他目录:cd /mntmkdir dbbackpwd/mnt/dbback创建shell脚本脚本名称可根据自己规范进行自定义:vim bcmysql.sh进入编辑器,输入以下内容:#!/bin/bashmysqldump -uusername -ppassword demo > /mnt/db...原创 2018-11-14 21:59:32 · 3829 阅读 · 3 评论 -
Mysql查询某条记录在分页的第几页
实践中我们会遇到这样的问题,知道某条记录的id,然后需要判断此条记录如果按照id进行排序分页,此条记录在第几页。今天这篇文章为大家提供一个思路。根据ID查询分页位置根据ID来查询分页位置,比如按照ID的倒序排列,则可通过以下SQL查询出大于此ID记录数:select count(id) from user where id > 5;示例中user为表名,5位待匹配的id。很显然...原创 2018-11-20 15:19:16 · 4928 阅读 · 0 评论 -
mysql替换某字段中的部分值
在mysql中某些字段比如,url地址,需要将http替换为https,无需编写程序,只需要执行update语句即可,基本格式:UPDATE `表名` SET `字段名` = REPLACE (`字段名`, '待替换字符串', '替换成此字符串');示例:UPDATE `app_product` SET `product_url` = REPLACE (`product_url`, 'ht...原创 2019-01-07 18:22:22 · 7815 阅读 · 0 评论 -
值得收藏:一份非常完整的 MySQL 规范
如果此刻不方便阅读,倾情为你准备了PDF版本,关注微信公众回复“mysql规范”即可获得。数据库命名规范· 所有数据库对象名称必须使用小写字母并用下划线分割。· 所有数据库对象名称禁止使用mysql保留关键字(如果表名中包含关键字查询时,需要将其用单引号括起来)。· 数据库对象的命名要能做到见名识意,并且最后不要超过32个字符。· 临时库表必须以tmp_为前缀并以日期为后缀,备份表必...转载 2019-03-12 12:22:16 · 605 阅读 · 0 评论 -
Centos7 安装Mysql5.7
下载Mysqlwget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.17-linux-glibc2.5-x86_64.tar.gz检查是否已安装mysqlrpm -qa | grep mysql如果安装则卸载:rpm -e 已经存在的MySQL全名解压解压到/usr/local:sudo tar -zxvf...原创 2019-05-08 20:55:24 · 1584 阅读 · 8 评论 -
Mysql SSH隧道连接使用方法
为了安全,mysql的root用户只本机登录,不对外网进行授权访问,此时可通过SSH隧道连接mysql数据库。以下为配置Mysql SSH隧道连接的基本步骤。删除远程登录登录mysql: mysql -uroot -p查看用户开放的访问权限:select user, host from mysql.user;删除不需要的访问权限,比如:delete from mysql.user...原创 2019-05-09 08:28:12 · 6632 阅读 · 1 评论 -
Mysql事物锁等待超时 Lock wait timeout exceeded; try restarting transaction
工作中同事遇到此异常,查找解决问题时,收集整理形成此篇文章。问题场景问题出现环境: 1、在同一事务内先后对同一条数据进行插入和更新操作; 2、多台服务器操作同一数据库; 3、瞬时出现高并发现象;不断的有一下异常抛出,异常信息:org.springframework.dao.CannotAcquireLockException: ### Error updating database. Ca原创 2016-02-22 16:50:57 · 117224 阅读 · 1 评论