
MySQL
文章平均质量分 78
Meiko丶
这个作者很懒,什么都没留下…
展开
-
索引下推
索引下推(index condition pushdown )简称ICP,在Mysql5.6的版本上推出,用于优化查询。 在不使用ICP的情况下,在使用非主键索引(又叫普通索引或者二级索引)进行查询时,存储引擎通过索引检索到数据,然后返回给MySQL服务器,服务器然后判断数据是否符合条件 。 在使用ICP的情况下,如果存在某些被索引的列的判断条件时,MySQL服务器将这一部分判断条件传递给存储引擎,然后由存储引擎通过判断索引是否符合MySQL服务器传递的条件,只有当索引符合条件时才会将数据检索出来返回给原创 2022-01-26 15:08:47 · 4903 阅读 · 4 评论 -
索引长度
在设置 utf8mb4 字段的字符长度时,可能会抛出一个异常:"Specified key was too long; max key length is 1000 bytes"。也就是在给表的索引字段添加字符长度时,超过了最大索引长度 1000 字节。一、原因分析关于索引长度的限制,最主要的因素就是存储引擎和字符集。字符集的影响在于,不同的字符集,单个字符包含的最大字节数有所不同。比如 utf8 字符集,一个字符最多包含 3 个字节。而 utf8mb4 一个字符最多包含 4 个字节。对于 In原创 2022-01-26 15:01:36 · 3275 阅读 · 0 评论 -
mysql 行行比较查询写法
环境准备数据库版本: MySQL 5.7.20-log建表 SQL:DROP TABLE IF EXISTS `t_ware_sale_statistics`;CREATE TABLE `t_ware_sale_statistics` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键id', `business_id` bigint(20) NOT NULL COMMENT '业务机构编码', `ware_inside_cod转载 2022-01-19 10:43:10 · 1085 阅读 · 0 评论 -
一些情况下会导致事务自动提交
正常来说,当我们开启一个事务之后,需要 commit 或者 rollback 来结束一个事务的,但是有时候,一些操作会自动帮我们提交事务,如果大家不了解隐式事务的话,那么在具体使用事务的事务可能就会遭遇一些莫名其妙的问题。1. DDL 操作首先一点就是 DDL 操作会隐式提交事务,这个松哥在之前的文章中其实有说过,我们再来一起回顾下:所有的 DDL 语句都会导致事务隐式提交,换句话说,当你在执行 DDL 语句前,事务就已经提交了。这就意味着带有 DDL 语句的事务将来没有办法 rollback转载 2022-01-11 19:16:32 · 1795 阅读 · 0 评论 -
count(*) 性能
当我们对一张数据表中的记录进行统计的时候,习惯都会使用 count 函数来统计,但是 count 函数传入的参数有很多种,比如 count(1)、count(*)、count(字段) 等。到底哪种效率是最好的呢?是不是 count(*) 效率最差?我曾经以为 count(*) 是效率最差的,因为认知上 selete * from t 会读取所有表中的字段,所以凡事带有 * 字符的就觉得会读取表中所有的字段,当时网上有很多博客也这么说。但是,当我深入 count 函数的原理后,被啪啪啪的打脸了!转载 2022-01-10 16:42:58 · 384 阅读 · 0 评论 -
mysql 批量插入
最近新的项目写了不少各种 insertBatch 的代码,一直有人说,批量插入比循环插入效率高很多,那本文就来实验一下,到底是不是真的?测试环境:SpringBoot 2.5 Mysql 8 JDK 8 Docker首先,多条数据的插入,可选的方案:foreach循环插入 拼接sql,一次执行 使用批处理功能插入搭建测试环境`sql文件:drop database IF EXISTS test;CREATE DATABASE test;use test;DROP T转载 2022-01-10 14:59:15 · 4379 阅读 · 1 评论 -
select, from ,join ,on ,where groupby,having ,order by limit的执行顺序
原创 2022-01-07 10:03:04 · 1057 阅读 · 0 评论 -
mysql查询前百分之几的数据(以25%为例)
因为mysql没有top的用法,而且limit后也不支持子查询所以实现相对麻烦,可以使用类似于Oracle中伪列的用法select @rownum:=@rownum+1,student.*from (select @rownum:=0) row ,student;可以看到表中有5条数数据select round(count(*)/4) from student补充一下这里的rownum只是个变量名,也可以是用其他的,不一定非得@rownumselect @rownum:=@r.转载 2022-01-06 10:46:05 · 2391 阅读 · 0 评论 -
Mysql-如何建表更符合业务
索引索引是 数据库中 对某一列或者多个列的值进行预排序的数据结构也就是说你存放数据的时候 其实已经排列好顺序了。索引可以理解为数据的 目录InnoDB中,主键是一个特殊的索引字段主键InnoDB中, 每个表都有一个主键如果你没有声明某个字段为主键,则表中 有一个 非空的唯一索引(Unique NOT NULL) 会默认成为主键如果有多个 非空的唯一索引,则选择 第一个定义的索引为主键如果没有 unique not null,则InnoDB会自动创建一个 6字节的指针,作为转载 2021-12-29 16:41:20 · 317 阅读 · 0 评论 -
MySQL-连表查询详
MySQL连表查询是一把双刃剑,一方面通过连表查询可以简化SQL的数量;但另一方面如果连接的表数据量较大,或者连接的表较多,其产生的笛卡尔积会成指数级增长,所以有些公司会禁用连表查询。一、连表查询简介连表查询即两张表或多张表联合查询,联合查询得到的结果称为笛卡尔积,假设A表中有n条记录,B表表中有m条记录,则它们联合查询得到的笛卡尔积为:n*m大家可能听过很多种连接方式,比如内连接、外连接、自然连接、交叉连接、左连接以及右连接,但MySQL的连表查询其实只有3种:内连接、外连接、自然连接。 其中原创 2021-12-27 15:23:59 · 6244 阅读 · 0 评论 -
查询出每个分组中的 top n 条记录
问题描述需求:查询出每月 order_amount(订单金额) 排行前3的记录。例如对于2019-02,查询结果中就应该是这3条:解决方法MySQL 5.7 和 MySQL 8.0 有不同的处理方法。1. MySQL 5.7我们先写一个查询语句。根据 order_date 中的年、月,和order_amount进行降序排列。然后,添加一个新列:order_amount(本条记录在本月中的名次)。执行结果:...原创 2021-12-24 10:33:43 · 360 阅读 · 0 评论 -
Mysql在什么情况下会使用内部临时表
union执行为了便于分析,使用一下sql来进行举例CREATE TABLE t1 ( id INT PRIMARY KEY, a INT, b INT, INDEX ( a ) );delimiter ;;CREATE PROCEDURE idata ( ) BEGINDECLARE i INT; SET i = 1; WHILE ( i <= 1000 ) DO INSERT INTO t1 VALUES ( i, i, i ); S转载 2021-12-07 11:28:35 · 545 阅读 · 0 评论 -
Mysql ALTER TABLE 加字段的时候到底锁不锁表
Mysql5.6版本之前更新步骤 对原始表加写锁 按照原始表和执行语句的定义,重新定义一个空的临时表。 对临时表进行添加索引(如果有)。 再将原始表中的数据逐条Copy到临时表中。 当原始表中的所有记录都被Copy临时表后,将原始表进行删除。再将临时表命名为原始表表名。 这样的话整个DDL过程的就是全程锁表的。Mysql5.6版本之后更新步骤 对原始表加写锁 按照原始表和执行语句的定义,重新定义一个空的临时表。并申请rowlog的转载 2021-12-06 11:29:39 · 11438 阅读 · 0 评论 -
为什么Mysql有时会抖一下?
一条SQL语句,正常执行的时候特别快,但是有时也不知道怎么回事,它就会变得特别慢,并且这样的场景很难复现,它不只随机,而且持续时间还很短。SQL语句为什么变“慢”了?InnoDB在处理更新语句的时候,只做了写日志这一个磁盘操作。这个日志叫作redo log(重做日志),在更新内存写完redo log后,就返回给客户端,本次更新成功。数据库总要找时间把数据进行下更新(内存里的数据写入磁盘,术语就是flush)。在这个flush操作执行之前,内存中的数据与磁盘中的数据是不一致的。 当内存数据页跟磁盘转载 2021-11-30 19:04:42 · 113 阅读 · 0 评论 -
关于mysql的参数autocommit
背景知识:mysql事务支持的引擎是InnoDB默认情况下autocommit的值为11.首先准备一张innodb引擎的测试表:CREATE TABLE `test` ( `id` int(11) NOT NULL) ENGINE=InnoDB;INSERT INTO `test` VALUES ('1');INSERT INTO `test` VALUES ('3');INSERT INTO `test` VALUES ('5');2.执行如下命令可以发现mysql的autoc.原创 2021-10-22 17:43:09 · 4335 阅读 · 0 评论 -
mysql死锁分析
环境准备数据库隔离级别:mysql> select @@tx_isolation;+-----------------+| @@tx_isolation |+-----------------+| REPEATABLE-READ |+-----------------+1 row in set, 1 warning (0.00 sec)复制代码自动提交关闭:mysql> set autocommit=0;Query OK, 0 rows affected (原创 2021-10-22 17:33:48 · 755 阅读 · 0 评论 -
sql建议
1、查询SQL尽量不要使用select *,而是select具体字段。反例子:select * from employee;复制代码正例子:select id,name from employee;复制代码理由:只取需要的字段,节省资源、减少网络开销。 select * 进行查询时,很可能就不会使用到覆盖索引了,就会造成回表查询。2、如果知道查询结果只有一条或者只要最大/最小一条记录,建议用limit 1假设现在有employee员工表,要找出一个名字叫jay的人.原创 2021-10-20 14:25:13 · 225 阅读 · 0 评论 -
索引失效杂症
一、查询条件包含or,可能导致索引失效新建一个user表,它有一个普通索引userId,结构如下:CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `userId` int(11) NOT NULL, `age` int(11) NOT NULL, `name` varchar(255) NOT NULL, PRIMARY KEY (`id`), KEY `idx_userId` (`userId`))原创 2021-10-19 18:56:53 · 163 阅读 · 0 评论 -
order by 原理和优化
一个使用order by 的简单例子假设用一张员工表,表结构如下:CREATE TABLE `staff` (`id` BIGINT ( 11 ) AUTO_INCREMENT COMMENT '主键id',`id_card` VARCHAR ( 20 ) NOT NULL COMMENT '身份证号码',`name` VARCHAR ( 64 ) NOT NULL COMMENT '姓名',`age` INT ( 4 ) NOT NULL COMMENT '年龄',`city` VAR转载 2021-10-12 17:06:01 · 1930 阅读 · 1 评论 -
MySQL日志15连问
1. redo log是什么? 为什么需要redo log?redo log 是什么呢?redo log 是重做日志。 它记录了数据页上的改动。 它指事务中修改了的数据,将会备份存储。 发生数据库服务器宕机、或者脏页未写入磁盘,可以通过redo log恢复。 它是Innodb存储引擎独有的为什么需要 redo log?redo log主要用于MySQL异常重启后的一种数据恢复手段,确保了数据的一致性。 其实是为了配合MySQL的WAL机制。因为MySQL进行更新操作,为了能够快速响应转载 2021-10-12 16:39:23 · 139 阅读 · 0 评论 -
MySQL 是如何执行一条查询语句的?
MYSQL体系结构先看一张架构图,如下:模块详解 Connector:用来支持各种语言和 SQL 的交互,比如 PHP,Python,Java 的 JDBC; Management Serveices & Utilities:系统管理和控制工具,包括备份恢复、MySQL 复制、集群等; Connection Pool:连接池,管理需要缓冲的资源,包括用户密码权限线程等等; SQL Interface:用来接收用户的 SQL 命令,返回用户需要的查询结果转载 2021-10-12 16:05:27 · 147 阅读 · 0 评论 -
如何解决MySQL深分页问题
我们日常做分页需求时,一般会用limit实现,但是当偏移量特别大的时候,查询效率就变得低下。本文将分4个方案,讨论如何优化MySQL百万数据的深分页问题,并附上最近优化生产慢SQL的实战案例。limit深分页为什么会变慢?先看下表结构哈:CREATETABLEaccount(idint(11)NOTNULLAUTO_INCREMENTCOMMENT'主键Id',namevarchar(255)DEFAULTNULLCOMMENT'账户名',bala...转载 2021-10-08 14:10:32 · 495 阅读 · 0 评论 -
sharding-jdbc
一、Sharding-JDBC 简介Sharding-JDBC最早是当当网内部使用的一款分库分表框架,到2017年的时候才开始对外开源,这几年在大量社区贡献者的不断迭代下,功能也逐渐完善,现已更名为ShardingSphere,2020年4⽉16⽇正式成为Apache软件基⾦会的顶级项⽬。随着版本的不断更迭ShardingSphere的核心功能也变得多元化起来。从最开始 Sharding-JDBC 1.0 版本只有数据分片,到 Sharding-JDBC 2.0 版本开始支持数据库治理(...转载 2021-06-30 17:49:48 · 1751 阅读 · 0 评论 -
mysql explain
Explain有什么用当Explain 与 SQL语句一起使用时,MySQL 会显示来自优化器关于SQL执行的信息。也就是说,MySQL解释了它将如何处理该语句,包括如何连接表以及什么顺序连接表等。表的加载顺序 sql 的查询类型 可能用到哪些索引,哪些索引又被实际使用 表与表之间的引用关系 一个表中有多少行被优化器查询 .....Explain有哪些信息Explain 执行计划包含字段信息如下:分别是 id、select_type、table、partitions、type、poss原创 2021-06-30 11:48:01 · 83 阅读 · 0 评论 -
分库分表
为什么要分库分表关系型数据库以MySQL为例,单机的存储能力、连接数是有限的,它自身就很容易会成为系统的瓶颈。当单表数据量在百万以里时,我们还可以通过添加从库、优化索引提升性能。一旦数据量朝着千万以上趋势增长,再怎么优化数据库,很多操作性能仍下降严重。为了减少数据库的负担,提升数据库响应速度,缩短查询时间,这时候就需要进行分库分表。二、如何分库分表分库分表就是要将大量数据分散到多个数据库中,使每个数据库中数据量小响应速度快,以此来提升数据库整体性能。核心理念就是对数据进行切.原创 2021-06-08 17:49:09 · 333 阅读 · 0 评论 -
MySQL并发事务控制:锁、MVCC
事务的特性与隔离级别要讲锁,必须要先讲事务的特性与隔离级别,因为锁机制的存在是为了保证事务对应隔离级别下的特性.事务具有以下几个特性 在MySQL中,存在以下几种隔离级别 RU 读未提交,顾名思义,在这种隔离级别下,当多个事务并行对同一数据进行操作时,会读取未提交的数据,也被称之为脏读.这种隔离级别因为会出现脏读现象,所以在实际场景中很少用.RC 读提交,一个事务只能看见已经提交事务所做的改变.但这种隔离级别会出现 不可重复读现象,即在一个事务内,多次读同一数据,在这个事务还没有结束时,如果另一个原创 2021-03-15 19:38:42 · 279 阅读 · 0 评论 -
转载:数据库规范
一、建表规约【强制】(1) 存储引擎必须使用InnoDB解读:InnoDB支持事物、行级锁、并发性能更好,CPU及内存缓存页优化使得资源利用率更高。【强制】(2)每张表必须设置一个主键ID,且这个主键ID使用自增主键(在满足需要的情况下尽量短),除非在分库分表环境下。解读: 由于InnoDB组织数据的方式决定了需要有一个主键,而且若是这个主键ID是单调递增的可以有效提高插入的性能,避免过多的页分裂、减少表碎片提高空间的使用率。 而在分库分表环境下,则需要统一来分配各个表中的主键值,从而避免整转载 2021-03-08 16:53:01 · 174 阅读 · 0 评论 -
springboot调用存储过程
1.创建Mapper接口类public interface TCustomerOrgTempMapper {/*** 存储过程更新** @param map* @return*/Map<String,String> callProceUpdate(Map<String, String> map);}2.mybatis sql文件<?xml version="1.0" encoding="UTF-8" ?><!.原创 2021-01-21 17:49:51 · 4299 阅读 · 0 评论 -
mysql 存储树形结构
像mysql这样的关系型数据库,比较适合存储一些类似表格的扁平化数据,但是遇到像树形结构这样有深度的人,就很难驾驭了。 举个栗子:现在有一个要存储一下公司的人员结构,大致层次结构如下: (画个图真不容易。。) 那么怎么存储这个结构?并且要获取以下信息: 1.查询小天的直接上司。 2.查询老宋管理下的直属员工。 3.查询小天的所有上司。 4.查询老王管理的所有员工。 方案一、(Adjacency List)只存储当前节点的父节点信息。 CRE.转载 2021-01-05 15:04:06 · 3399 阅读 · 0 评论 -
别用select *
1. 不需要的列会增加数据传输时间和网络开销用“SELECT * ”数据库需要解析更多的对象、字段、权限、属性等相关内容,在 SQL 语句复杂,硬解析较多的情况下,会对数据库造成沉重的负担。 增大网络开销;* 有时会误带上如log、IconMD5之类的无用且大文本字段,数据传输size会几何增涨。如果DB和应用程序不在同一台机器,这种开销非常明显 即使 mysql 服务器和客户端是在同一台机器上,使用的协议还是 tcp,通信也是需要额外的时间。2. 对于无用的大字段,如 varchar、blob、原创 2020-10-27 18:37:12 · 244 阅读 · 0 评论 -
mysql 悲观锁,乐观锁
1. 悲观锁现在互联网高并发的架构中,受到fail-fast思路的影响,悲观锁已经非常少见了。悲观锁(Pessimistic Locking),悲观锁是指在数据处理过程,使数据处于锁定状态,一般使用数据库的锁机制实现。1.1 数据表中的实现在MySQL中使用悲观锁,必须关闭MySQL的自动提交,set autocommit=0,MySQL默认使用自动提交autocommit模式,也即你执行一个更新操作,MySQL会自动将结果提交。set autocommit=0举个????栗转载 2020-10-27 16:55:16 · 1533 阅读 · 0 评论 -
MySQL中IN和EXISTS的用法
exists对外表用loop逐条查询,每次查询都会查看exists的条件语句,当 exists里的条件语句能够返回记录行时(无论记录行是的多少,只要能返回),条件就为真,返回当前loop到的这条记录,反之如果exists里的条 件语句不能返回记录行,则当前loop到的这条记录被丢弃,exists的条件就像一个bool条件,当能返回结果集则为true,不能返回结果集则为 false如下:select * from user where exists (select 1);对user表的记录逐条取出转载 2020-10-21 11:23:27 · 2615 阅读 · 1 评论 -
mysql外键
如果一张表中有一个非主键的字段指向了另一张表中的主键,就将该字段叫做外键。一张表中外键可以有多个,也就是不同字段指向了不同表中的主键。需要注意数据表的存储引擎必须为InnoDB,因为InnoDB提供事务支持以及外部键等高级数据库功能,相反的MyISAM不支持。外键的作用是保持数据一致性、完整性,主要体现在下面两个方面:阻止执行从表插入新行,其外键值不是主表的主键值便阻止插入;从表修改外键值,新值不是主表的主键值便阻止修改;主表删除行,其主键值在从表里存在便阻止删除(要想删除,必须先删除从表的转载 2020-08-25 17:20:17 · 2192 阅读 · 0 评论 -
mysql中any,in,some,all的区别
子查询就是指在一个select语句中嵌套另一个select语句。any,in,some,all分别是子查询关键词之一,any 可以与=、>、>=、<、<=、<>结合起来使用,分别表示等于、大于、大于等于、小于、小于等于、不等于其中的任何一个数据。all可以与=、>、>=、<、<=、<>结合是来使用,分别表示等于、大于、大于等于、小于、小于等于、不等于其中的其中的所有数据。他们进行子查询的语法如下:operand co原创 2020-06-11 11:59:11 · 888 阅读 · 0 评论 -
mysql coalesce
今天无意间发现mysql的coalesce,coalesce()解释:返回参数中的第一个非空表达式(从左向右依次类推);使用示例:a,b,c三个变量。select coalesce(null,2,3); // Return 2select coalesce(null,null,3);// Return 3select coalesce(1,2,3);// Return 1通过上面例子可以看出,他的作用是将返回传入的参数中第一个非null的值,再比如 SELECT CO...原创 2020-06-04 19:27:25 · 221 阅读 · 0 评论 -
mysql group by。 distinct
表名:testusers,字段记录如图,以前create的直接拿来用,将就一下。(懒即生产力)一)作用:GROUP BY 语句根据一个或多个列对结果集进行分组。会把值相同放到一个组中,最终查询出的结果只会显示组中一条记录。(字母不好理解没关系,看下面的例子秒懂)二)example:1)基本用法:根据 sex 字段分组,查询用户名、年龄、电话、性别。这就分组成功了!男的一组 女的一组,还有一组那啥,咳咳,搞不清楚的,但是都只显示了组中一条记录,我们的效果不够明显,接着看下面的例子。)SE.原创 2020-06-04 19:17:57 · 692 阅读 · 1 评论 -
mysql链接原理
在一般的项目开发中,多表查询是必不可少的。而对于存在大量数据的情况下,简单的查询已经无法满足性能需求。这就需要对表结构和SQL进行优化。这次我们讲SQL优化的一种方式,连接查询(Join)和联合查询(union)和 MySQL中连接查询的原理。对于大型的数据表,我们建议尽量使用连接查询,而避免使用子查询。但是这不是绝对的,因为连接查询并不是在所有情况下最优的,在一些情况下,配合子查询使用,会使效率提高很多。本篇包括:join以及union简介 使用join需要注意的事项 MySQL 使转载 2020-06-04 17:26:16 · 545 阅读 · 0 评论 -
mysql fulltext
mysql全文索引使用条件首页要先明白mysql的全文检索原理:mysql使用的是一个非常简单的剖析器来将文本分隔成词,空格、标点等,比如‘welcom to you’将分隔为三个词‘welcom’、‘to’、‘you’,但是对中文来说,比如‘人力方网站正式上线’,这将无法分隔,因此目前mysql只支持 英文的全文检索。mysql全文索引使用条件有两个,一个是对表存储引擎类型的要求,二是对设置全文索引字段的类型的要求。表的存储引擎是MyISAM,默认存储引擎InnoDB不支持全文索引...原创 2020-06-04 16:58:34 · 1861 阅读 · 0 评论 -
mysql中的having,where,group by
1. where和having都可以使用的场景 select goods_price,goods_name from sw_goods where goods_price > 1001 select goods_price,goods_name from sw_goods having goods_price > 1001解释:上面的having可以用的前提是我已经...原创 2018-05-08 20:31:16 · 185 阅读 · 0 评论 -
mysql几种存储引擎的说明
1.innodb,是事务型数据库的首选引擎,支持事务安全表(ACID),支持行锁定和外键,InnoDB是默认的MySQL引擎2.MyISAM基于ISAM存储引擎,并对其进行扩展。它是在Web、数据仓储和其他应用环境下最常使用的存储引擎之一。MyISAM拥有较高的插入、查询速度,但不支持事物3.MEMORY存储引擎将表中的数据存储到内存中,未查询和引用其他表数据提供快速访问如果要提供提交、回滚、崩溃...原创 2018-05-12 19:27:15 · 181 阅读 · 0 评论