
Mysql
文章平均质量分 58
数据库
一蓑烟雨任平生2024
这个作者很懒,什么都没留下…
展开
-
Next-Key Lock(临键锁)
在 InnoDB 默认的隔离级别 REPEATABLE-READ 下,行锁默认使用的是 Next-Key Lock。但是,如果操作的索引是唯一索引或主键,InnoDB 会对 Next-Key Lock 进行优化,将其降级为 Record Lock,即仅锁住索引本身,而不是范围。原创 2024-04-20 20:01:53 · 284 阅读 · 0 评论 -
InnoDB中高度为3的B+树最多可以存多少数据?
考虑到磁盘IO是非常高昂的操作,计算机操作系统做了预读的优化,当一次IO时,不光把当前磁盘地址的数据,而是把也都读取到内存缓冲区内,因为当计算机访问一个地址的数据的时候,与其相邻的数据也会很快被访问到。每一次IO读取的数据我们称之为一页(page),具体一页有多大数据跟操作系统有关,一般为4k或8k,也就是我们读取一页内的数据时候,实际上才发生了一次IO。MySQL每个节点大小默认为16KB,也就是每个节点最多存16KB的数据,可以修改,最大64KB,最小4KB。原创 2024-04-14 16:50:31 · 1096 阅读 · 0 评论 -
Oracle分区表和Mysql的水平分表有何区别
综上所述,Oracle分区表在物理存储和查询优化方面提供了更为强大的原生支持,而MySQL水平分表的灵活性较高,但管理复杂度相对较大,需要更多应用层的介入。MySQL 5.5以后增加了分区表的支持,其特点与Oracle分区表相似,但具体实现和功能细节上仍存在差异。原创 2024-04-14 16:20:52 · 717 阅读 · 0 评论 -
mysql:聚簇索引和非聚簇索引区别
在非聚簇索引的叶子节点上存储的并不是真正的行数据,而是主键 ID,所以当我们使用非聚簇索引进行查询时,首先会得到一个主键 ID,然后再使用主键 ID 去聚簇索引上找到真正的行数据,我们把这个过程称之为回表查询。在聚簇索引中,表中行的物理顺序与键值的逻辑(索引)顺序相同。非聚簇索引的叶子节点不直接包含数据记录,而是包含了指向数据行的指针。聚簇索引直接将数据存储在 B+树的叶子节点中,而非聚簇索引的叶子节点存储的是指向数据行的指针。MyISAM 采用的是非聚簇索引,InnoDB 采用的是聚簇索引。转载 2024-04-02 22:21:55 · 87 阅读 · 0 评论 -
MySQL 索引:索引为什么使用 B+树?
B 树中每个节点(包括叶节点和非叶节点)都存储真实的数据,B+树中只有叶子节点存储真实的数据,非叶节点只存储键。红黑树保证最长路径不超过最短路径的二倍,因而近似平衡(最短路径就是全黑节点,最长路径就是一个红节点一个黑节点,当从根节点到叶子节点的路径上黑色节点相同时,最长路径刚好是最短路径的两倍):通过舍弃严格的平衡和引入红黑节点,解决了 AVL 旋转效率过低的问题,但是在磁盘等场景下,树仍然太高,IO 次数太多;从任一节点到其每个叶子的所有简单路径都包含相同数目的黑色节点(简称黑高)。原创 2024-03-21 22:54:43 · 705 阅读 · 0 评论 -
Mysql——索引下推
这意味着存储引擎在遍历索引的过程中,不仅可以利用索引快速定位记录,而且可以在读取索引的同时就完成一部分WHERE条件的判断,只取出那些真正满足所有条件的行数据,而不是先返回所有引用主键的记录,再由服务器层进一步筛选。例如,在一个带有多个列的索引中,即使查询条件包含了索引列和非索引列,ICP也能发挥作用,存储引擎可以直接在索引内部进行多列条件的初步筛选,减少不必要的回表操作(即减少访问实际数据页的次数),从而降低IO成本,提高查询性能。在没有启用索引下推的情况下,MySQL可能会首先使用复合索引。原创 2024-03-21 21:48:31 · 507 阅读 · 0 评论 -
MySQL自增主键一定是连续的吗
【代码】为什么MySQL的自增主键不单调也不连续?转载 2024-03-18 21:32:43 · 89 阅读 · 0 评论 -
Mysql的行级锁
只针对当前操作的行记录进行加锁。其加锁粒度最小,并发度高,但加锁的开销也最大,加锁慢,会出现死锁。行级锁和存储引擎有关,是在存储引擎层面实现的。但是,如果操作的索引是唯一索引或主键,InnoDB 会对 Next-Key Lock 进行优化,将其降级为。InnoDB 的行锁是针对索引字段加的锁,表级锁是针对非索引字段加的锁。不过,很多时候即使用了索引也有可能会走全表扫描,这是因为 MySQL 优化器的原因。这个在我们日常工作开发中经常会遇到,一定要多多注意!,即仅锁住索引本身,而不是范围。原创 2024-03-17 22:09:21 · 819 阅读 · 0 评论 -
explain命令详解
Using filesort 说明mysql会对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取,mysql中无法利用索引完成的排序成为文件排序。key_len:表示索引中使用的字节数(可能使用的,不是实际的),可通过该列查询中使用的索引的长度,在不损失精确性的情况下,长度越短越好。range:只检索给定范围的行,使用一个索引来选择行,一般就是在where语句中出现了between、、in等的查询。ref:显示索引的哪一列被用到,如果可能的话是一个常数,哪些常量被用于查找索引列上的值。原创 2024-03-17 20:23:28 · 847 阅读 · 0 评论 -
select for update
能有效解决并发环境下可能出现的数据竞争问题,尤其是在涉及“检查并设置”(Check-and-Set)模式的操作中,比如先检查某条件是否满足,然后决定是否更新数据。是一种用于锁定查询结果中特定行的方法,它允许你在事务处理过程中确保这些行不会被其他会话修改或者删除,直到当前事务结束(无论是通过提交COMMIT还是回滚ROLLBACK)。如果事务没有提交或回滚,那么锁定将持续存在,阻止其他会话修改这些行。提供了一种在并发环境下的数据一致性保障手段,通过锁定查询结果中的行,确保了在事务处理期间这些行的数据完整性。原创 2024-03-11 22:02:06 · 482 阅读 · 0 评论 -
Mysql主从复制原理
canal原理。原创 2024-03-03 20:03:08 · 361 阅读 · 0 评论 -
Mysql二级索引
二级索引转载 2023-02-18 14:58:16 · 173 阅读 · 0 评论 -
索引是怎么支撑千万级表的快速查找?
B+树索引转载 2023-02-18 14:55:52 · 226 阅读 · 0 评论 -
MySQL索引type级别意思
MySQL索引type级别意思转载 2023-02-18 14:37:39 · 1820 阅读 · 0 评论 -
为什么mysql默认隔离级别设置为RR(可重复读)
一般的DBMS系统,默认都会使用读提交(Read-Comitted,RC)作为默认隔离级别,如Oracle、SQLServer等,而MySQL却使用可重复读(Read-Repeatable,RR)。要知道,越高的隔离级别,能解决的数据一致性问题越多,理论上性能损耗更大,可并发性越低。隔离级别依次为>:串行化 > RR > RC >读未提交在SQL标准中,前三种隔离级别分别解决了幻象读、不可重复读和脏读的问题。那么,为什么MySQL使用可重复读作为默认隔离级别呢?这个是有历史.转载 2021-06-27 21:13:12 · 1740 阅读 · 0 评论 -
一条查询SQL的执行流程
查询SQL的执行过程当希望Mysql能够高效的执行的时候,最好的办法就是清楚的了解Mysql是如何执行查询的,只有更加全面的了解SQL执行的每一个过程,才能更好的进行SQl的优化。当执行一条查询的SQl的时候大概发生了一下的步骤:客户端发送查询语句给服务器。 服务器首先检查缓存中是否存在该查询,若存在,返回缓存中存在的结果。若是不存在就进行下一步。 服务器进行SQl的解析、语法检测和预处理,再由优化器生成对应的执行计划。 Mysql的执行器根据优化器生成的执行计划执行,调用存储引擎的接口进原创 2021-06-27 19:37:26 · 1990 阅读 · 0 评论 -
mysql int(10)和char(10)的区别
varchar(50)中50的涵义最多存放50个字符,varchar(50)和(200)存储hello所占空间一样,但后者在排序时会消耗更多内存,因为order by col采用fixed_length计算col长度(memory引擎也一样)。在早期 MySQL 版本中, 50 代表字节数,现在代表字符数。int(20)中20的涵义是指显示字符的长度。20表示最大显示宽度为20,但仍占4字节存储,存储范围不变;不影响内部存储,只是影响带 zerofill 定义的 int 时,前面补多少个 0原创 2021-06-25 07:10:58 · 1691 阅读 · 0 评论 -
mysql的COLLATE=utf8_unicode_ci是什么意思?
在mysql中执行show create table 指令,可以看到一张表的建表语句,example如下:CREATE TABLE `table1` (`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,`field1` text COLLATE utf8_unicode_ci NOT NULL COMMENT '字段1',`field2` varchar(128) COLLATE utf8_unicode_ci NOT NULL DEFAULT原创 2021-06-10 22:29:37 · 7803 阅读 · 1 评论 -
mysql中的DATE_FORMAT(NOW(),‘%Y-%m-%d‘)函数
1.格式:DATE_FORMAT(date,format) 函数用于显示日期或时间数据的不同样式。1.1参数:date 合法的日期;format 最终输出的日期/时间;2.参考:DATE_FORMAT(NOW(),’%Y-%m-%d’) 格式转换SELECT DATE_FORMAT(NOW(),'%Y-%m-%d') AS '日期'...原创 2021-06-04 08:06:43 · 4413 阅读 · 0 评论 -
Spring Data Jpa实践案例
https://www.cnblogs.com/chenglc/p/11226693.html原创 2021-04-06 08:46:57 · 189 阅读 · 0 评论 -
Mysql中replace与replace into的用法讲解
转:https://www.cnblogs.com/c-961900940/p/6197878.htmlhttps://www.jb51.net/article/158125.htmreplace into 主要作用类似insert插入操作。主要的区别是replace会根据主键或者唯一索引检查数据是否存在,如果存在就先删除在更新。1. 尝试把新行插入到表中2. 当因为对于主键或唯一关键字出现重复关键字错误而造成插入失败时:a. 从表中删除含有重复关键字值的冲突行 b. 再次尝试把原创 2021-03-27 15:39:40 · 544 阅读 · 0 评论 -
MVCC原理
https://baijiahao.baidu.com/s?id=1629409989970483292&wfr=spider&for=pchttps://www.jianshu.com/p/8845ddca3b23原创 2021-03-11 10:26:45 · 157 阅读 · 0 评论 -
聚簇索引和非聚簇索引的区别(转)
https://www.cnblogs.com/jiawen010/p/11805241.html总结:InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,聚簇索引就是按照每张表的主键构造一颗B+树,同时叶子节点中存放的就是整张表的行记录数据,也将聚集索引的叶子节点称为数据页。这个特性决定了索引组织表中数据也是索引的一部分; 一般建表会用一个自增主键做聚簇索引,没有的话MySQL会默认创建,但是这个主键如果更改代价较高,故建表时要考虑自增ID不能频繁update这点。 .转载 2021-03-11 09:48:16 · 260 阅读 · 0 评论 -
MySQL的YEARWEEK函数以及查询本周数据(转)
https://www.cnblogs.com/ganymede/p/3811873.html原创 2021-03-01 15:17:29 · 246 阅读 · 1 评论 -
Mysql 的varchar能存几个字符?
utf8编码的varchar Mysql记录行数据是有限的。大小为64k,即65535个字节,而varchar要用1-2字节来存储字段长度,小于255的1字节,大于255的2字节。 Mysql 5.0后,英文字符固定都是一个字节,汉字字符根据编码方式占不同字节,Utf-8占3个字节,gbk占了2个字节。 第一,当编码方式为utf-8时,varchar存到21845就存不下了.也就是最大长度是21844.根据上面信息可以推算出 ( 65535-2 )/3=21844余1 例子如下:原创 2020-11-30 17:48:50 · 7033 阅读 · 0 评论 -
mysql隔离级别实现原理
(一)事务四大属性分别是原子性、一致性、隔离性、持久性。 1、原子性(Atomicity)原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。 2、一致性(Consistency)一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。举例来说,假设用户A和用户B两者的钱加起来一共是1000,那么不管A和B之间如何...转载 2020-10-20 21:58:48 · 2318 阅读 · 0 评论 -
sql表连接的几种方式
sql表连接的几种方式这里有两张表TableA和TableB,分别是姓名表和年龄表,用于我们例子的测试数据TableA id name 1 t1 2 t2 4 t4 TableB id age 1 18 2 20 3原创 2020-10-15 08:31:35 · 7730 阅读 · 1 评论 -
面试题:Mysql如何保证一致性?
一,关于事务和一致性的理解事务的产生,其实是为了当应用程序访问数据库的时候,事务能够简化我们的编程模型,不需要我们去考虑各种各样的潜在错误和并发问题.可以想一下当我们使用事务时,要么提交,要么回滚,我们不会去考虑网络异常了,服务器宕机了,同时更改一个数据怎么办对吧?因此事务本质上是为了应用层服务的.而不是伴随着数据库系统天生就有的。ACID里的AID都是数据库的特征,也就是依赖数据库的具体实现.而唯独这个C,实际上它依赖于应用层,也就是依赖于开发者.这里的一致性是指系统从一个正确的状态,迁移到另一个正确转载 2020-10-13 22:21:22 · 709 阅读 · 1 评论 -
内连接和外连接的区别
内连接:指连接结果仅包含符合连接条件的行,参与连接的两个表都应该符合连接条件。内连接就是左表和右表相同的数据外连接:连接结果不仅包含符合连接条件的行同时也包含自身不符合条件的行。包括左外连接、右外连接和全外连接。1、内连接内连接,即最常见的等值连接,例:SELECT*FROMTESTA,TESTBWHERETESTA.A=TESTB.A2、外连接外连接分为左外连接,右外连接和全外连接。左外连接left outer join或者left join左外连...原创 2020-09-24 13:59:22 · 11445 阅读 · 0 评论 -
SQL练习:查询各科成绩前三名的记录
查询各科成绩前三名的记录解法(不考虑并列的情况)该解法是不考虑并列的情况下注意:此解法的前提是忽略成绩并列情况,否则出来的结果有问题。先给结果sql,再讲思路:SELECT a.s_id, a.c_id, a.s_score FROM score a LEFT JOIN score b ON a.c_id = b.c_id AND a.s_score <= b.s_score GROUP BY a.s_id, a.c_id, a.s_score HAVING转载 2020-09-10 13:51:15 · 12574 阅读 · 0 评论 -
MySQL学习笔记:count(1)、count(*)、count(字段)的区别
关于数据库中行数统计,无论是MySQL还是Oracle,都有一个函数可以使用,那就是COUNT。但是,就是这个常用的COUNT函数,却暗藏着很多玄机,尤其是在面试的时候,一不小心就会被虐。不信的话请尝试回答下以下问题:> 1、COUNT有几种用法?> 2、COUNT(字段名)和COUNT(*)的查询结果有什么不同?> 3、COUNT(1)和COUNT(*)之间有什么不同?> 4、COUNT(1)和COUNT(*)之间的效率哪个更高?> 5、为什么《阿里巴巴Ja原创 2020-09-10 10:59:49 · 481 阅读 · 0 评论 -
Mysql索引——B+树是怎么提高查询效率?
MySQL的索引本质上是一种数据结构让我们先来了解一下计算机的数据加载。磁盘IO和预读:先说一下磁盘IO,磁盘读取数据靠的是机械运动,每一次读取数据需要寻道、寻点、拷贝到内存三步操作。寻道时间是磁臂移动到指定磁道所需要的时间,一般在5ms以下;寻点是从磁道中找到数据存在的那个点,平均时间是半圈时间,如果是一个7200转/min的磁盘,寻点时间平均是600000/7200/2=4.17ms;拷贝到内存的时间很快,和前面两个时间比起来可以忽略不计,所以一次IO的时间平均是在9ms.转载 2020-09-09 20:46:54 · 2690 阅读 · 1 评论 -
Mysql数据库的底层索引,为什么采用B+树而不是二叉树和红黑树?
平衡多路查找树B Tree :B-Tree是为磁盘等外存储设备设计的一种平衡查找树。系统从磁盘读取数据到内存时是以磁盘块(block)为基本单位的,位于同一个磁盘块中的数据会被一次性读取到内存中。在Mysql存储引擎中有页(Page)的概念,页是其磁盘管理的最小单位。Mysql存储引擎中默认每个页的大小为16KB,因此Mysql每次申请磁盘空间时都会 将若干地址连续磁盘块来达到页的大小16KB。Mysql在把磁盘数据读入到磁盘时会以页为基本单位, 在查询数据时如果一个页中的每条数据都能有助于定位数据记录转载 2020-09-09 20:43:44 · 1711 阅读 · 0 评论 -
为什么 select count(*) from t,在 InnoDB 引擎中比 MyISAM 慢?
统计一张表的总数量,是我们开发中常有的业务需求,通常情况下,我们都是使用 select count(*) from t SQL 语句来完成。随着业务数据的增加,你会发现这条语句执行的速度越来越慢,为什么它会变慢呢?为什么会变慢?想要得到答案就需要知道 MySQL 是如何统计总数量的,先说一个前提吧,count(*) 的具体实现是由存储引擎实现的,也就是说不同的存储引擎实现的方式不一样。标题:为什么select count( * ) from t,在 InnoDB 引擎中比 MyISAM 慢?也是高频原创 2020-09-08 16:30:39 · 479 阅读 · 0 评论 -
关系型数据库和非关系型数据及其区别
一、关系型数据库关系型数据库最典型的数据结构是表,由二维表及其之间的联系所组成的一个数据组织优点:1、易于维护:都是使用表结构,格式一致;2、使用方便:SQL语言通用,可用于复杂查询;3、复杂操作:支持SQL,可用于一个表以及多个表之间非常复杂的查询。缺点:1、读写性能比较差,尤其是海量数据的高效率读写;2、固定的表结构,灵活度稍欠;3、高并发读写需求,传统关系型数据库来说,硬盘I/O是一个很大的瓶颈。二、非关系型数据库非关系型数据库严格上不是一种数据库,应..原创 2020-08-30 22:40:16 · 25140 阅读 · 0 评论 -
B树,B-树,B+树
B树即二叉搜索树: 所有非叶子结点至多拥有两个儿子(Left和Right); 所有结点存储一个关键字; 非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树; 如:B-树是一种多路搜索树(并不是二叉的): 定义任意非叶子结点最多只有M个儿子;且M>2; 根结点的儿子数为[2, M]; 除根结点以外的非叶子结点的儿子数为[M/2, M]; 每个结点存放至少M/2-1(取上整)和至多M-1个关键字;(至少2原创 2020-08-24 16:22:07 · 157 阅读 · 0 评论 -
Mysql中的日志
日志是mysql数据库的重要组成部分,记录着数据库运行期间各种状态信息。mysql日志主要包括错误日志、查询日志、慢查询日志、事务日志、二进制日志几大类。作为开发,我们重点需要关注的是二进制日志(binlog)和事务日志(包括redo log和undo log),本文接下来会详细介绍这三种日志。binlogbinlog用于记录数据库执行的写入性操作(不包括查询)信息,以二进制的形式保存在磁盘中。binlog是mysql的逻辑日志,并且由Server层进行记录,使用任何存储引擎的mysql数据库都会记转载 2020-08-24 15:51:10 · 489 阅读 · 0 评论 -
Mysql的函数和存储过程的区别
存储过程和函数:类似于java中的方法.相同点:含义:一组预先编译好的SQL语句的集合,理解成批处理语句1、提高代码的重用性2、简化操作3、减少了编译次数并且减少了和数据库服务器的连接次数,提高了效率区别:存储过程(procedure):可以有0个返回,也可以有多个返回,适合做批量插入、批量更新函数(function):有且仅有1 个返回,适合做处理数据后返回一个结果(return)目录函数的使用存储过程的使用函数的使用#一、创建语法CREATE FUN..原创 2020-08-21 09:05:41 · 1127 阅读 · 1 评论 -
Mysql的索引应该怎么建立?
哪些情况需要创建索引?1.主键自动建立唯一索引2.频繁作为查询条件的字段应该创建索引(where 后面的语句)3.查询中与其它表关联的字段,外键关系建立索引4.在高并发下倾向创建组合索引5.查询中排序的字段,排序字段若通过索引去访问将大大提高排序速度6.查询中统计或者分组字段哪些情况不需要创建索引?1.表记录太少2.经常增删改的表:Why:提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保原创 2020-08-20 09:23:32 · 749 阅读 · 0 评论 -
Mysql的表锁和行锁
目录表锁读锁写锁总结行锁行锁可能出现的两个问题无索引行锁变表锁间隙锁行锁的使用总结优化建议表锁偏向MyISAM存储引擎,开销小,加锁快;无死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。手动增加表锁】lock table 表名字1 read(write),表名字2 read(write),其它;【查看表上加过的锁】 show open tables;【释放表锁】unlock tables;读锁写锁...原创 2020-08-19 20:39:18 · 355 阅读 · 0 评论