Loading

合集-MySQL

摘要:MySQL索引详解 索引介绍 索引是一种用于快速查询和检索数据的数据结构,其本质可以看成是一种排序好的数据结构。索引的作用就相当于书的目录。打个比方: 我们在查字典的时候,如果没有目录,那我们就只能一页一页的去找我们需要查的那个字,速度很慢。如果有目录了,我们只需要先去目录里查找字的位置,然后直接翻 阅读全文
posted @ 2024-07-05 11:52 Duancf 阅读(43) 评论(0) 推荐(0)
摘要:索引底层数据结构选型 Hash 表 哈希表是键值对的集合,通过键(key)即可快速取出对应的值(value),因此哈希表可以快速检索数据(接近 O(1))。 为何能够通过 key 快速取出 value 呢? 原因在于 哈希算法(也叫散列算法)。通过哈希算法,我们可以快速找到 key 对应的 inde 阅读全文
posted @ 2024-08-25 22:12 Duancf 阅读(29) 评论(0) 推荐(0)
摘要:索引失效 https://mp.weixin.qq.com/s/mwME3qukHBFul57WQLkOYg 未遵循最左匹配原则 由于构建一棵 B+树只能根据一个值来确定索引关系,所以联合索引的B+树依赖联合索引最左侧的元素建立树结构。所以如果想要利用B+树进行数据筛选,必须要提供联合索引的最左列。 阅读全文
posted @ 2024-07-05 11:49 Duancf 阅读(50) 评论(0) 推荐(0)
摘要:范式 第一范式:所有属性都是不可再分的基本数据项 第二范式:一是表必须有一个主键;二是非主属性必须完全依赖于主键。去掉部份依赖,比如一张表是(学生id,课程id,成绩,课程名称),主键是学生id加上课程id,但是课程名只部分依赖于主键中的课程id 第三范式:每一个非主属性都不传递依赖于该范式的候选键 阅读全文
posted @ 2024-09-12 22:30 Duancf 阅读(26) 评论(0) 推荐(0)
摘要:数据库优化 1)从设计层面,在数据库设计阶段需要遵从数据库设计的范式,避免冗余数据。对于大表,可以采用拆表的方式,将一个大表拆分为多个小表,减少单表的数据量。同时避免数据类型不当、字段过多等原因导致数据库查询效率降低。 2)从索引层面,需要优化索引的数量、字段选择、索引类型等。应该将经常查询的字段, 阅读全文
posted @ 2024-07-05 11:57 Duancf 阅读(103) 评论(0) 推荐(0)
摘要:Explain执行计划分析 什么是执行计划? 执行计划 是指一条 SQL 语句在经过 MySQL 查询优化器 的优化后,具体的执行方式。 执行计划通常用于 SQL 性能分析、优化等场景。通过 EXPLAIN 的结果,可以了解到如数据表的查询顺序、数据查询操作的操作类型、哪些索引可以被命中、哪些索引实 阅读全文
posted @ 2024-07-05 11:48 Duancf 阅读(46) 评论(0) 推荐(0)
摘要:Log undo log(回滚日志):是 Innodb 存储引擎层生成的日志,实现了事务中的原子性,主要用于事务回滚和 MVCC; redo log(重做日志):是 Innodb 存储引擎层生成的日志,实现了事务中的持久性,主要用于掉电等故障恢复; binlog (归档日志):是 Server 层生 阅读全文
posted @ 2024-07-05 11:55 Duancf 阅读(71) 评论(0) 推荐(0)
摘要:事务 在理解事务的概念之前,接触数据库系统的其他高级特性还言之过早。事务就是一组原子性的SQL查询,或者说一个独立的工作单元。如果数据库引擎能够成功地对数据库应用该组查询的全部语句,那么就执行该组查询。如果其中有任何一条语句因为崩溃或其他原因无法执行,那么所有的语句都不会执行。也就是说,事务内的语句 阅读全文
posted @ 2024-07-05 14:12 Duancf 阅读(36) 评论(0) 推荐(0)
摘要:慢查询 如何找到慢查询语句 要找出项目中的慢查询语句,可以通过几种方法,主要取决于你使用的数据库系统。以下是一些通用的步骤和针对MySQL和PostgreSQL数据库的具体方法: 通用步骤: 启用慢查询日志:大多数数据库管理系统都支持慢查询日志,通过配置可以记录执行时间超过指定阈值的查询。 分析日志 阅读全文
posted @ 2024-07-05 11:56 Duancf 阅读(227) 评论(0) 推荐(0)
摘要:隔离级别 下面介绍四种因为事务的并发产生的问题: 脏写 假设银行账户中有100元, 有事务A,B A事务把余额改为200,但还未提交 这时,B事务把余额改为300,提交, 如果A发生了回滚,那么账户余额回到100元,事务B无效。 脏写就是已经提交的事务的写操作因为另一个还未提交的事务的回滚而失去效果 阅读全文
posted @ 2024-07-12 15:49 Duancf 阅读(50) 评论(0) 推荐(0)
摘要:多版本并发控制 MVCC MVCC 只在 读取已提交(Read Committed)和 可重复读(Repeatable Read)两个事务级别下有效, 依靠ReadView,undo log,记录的隐藏字段实现, 用一句话概括MVVC的原理就是,在创建事务或者select的时候生成readview快 阅读全文
posted @ 2024-07-05 14:15 Duancf 阅读(63) 评论(0) 推荐(0)
摘要:[Mysql]持久化 阅读全文
posted @ 2024-07-05 21:39 Duancf 阅读(18) 评论(0) 推荐(0)
摘要:MySQL 的数据都是存在磁盘中的,那么我们要更新一条记录的时候,得先要从磁盘读取该记录,然后在内存中修改这条记录。那修改完这条记录是选择直接写回到磁盘,还是选择缓存起来呢? 当然是缓存起来好,这样下次有查询语句命中了这条记录,直接读取缓存中的记录,就不需要从磁盘获取数据了。 为此,Innodb 存 阅读全文
posted @ 2024-07-12 16:31 Duancf 阅读(40) 评论(0) 推荐(0)
摘要:这个问题我看网上有人做了实验,是in的效率会比or高 去查了官方文档 expr IN (value,...) Returns 1 (true) if expr is equal to any of the values in the IN() list, else returns 0 (false) 阅读全文
posted @ 2024-07-12 19:43 Duancf 阅读(25) 评论(0) 推荐(0)
摘要:共享锁 排他锁 表锁 行锁 意向锁 意向锁是表锁,为了协调行锁和表锁的关系,支持多粒度(表锁与行锁)的锁并存。 当有事务A有行锁时,MySQL会自动为该表添加意向锁,事务B如果想申请整个表的写锁,那么不需要遍历每一行判断是否存在行锁,而直接判断是否存在意向锁,增强性能。 悲观锁 乐观锁 间隙锁 间隙 阅读全文
posted @ 2024-07-16 21:18 Duancf 阅读(55) 评论(0) 推荐(0)
摘要:next-key lock 参考资料1 这一节我们通过实验验证next-key-lock在各种情况下的表现: 在唯一索引上的等值查询 我们利用主键展现这一特性 命中记录 下面我们来解释这张图发生了什么, 会话A 会话B 1 开启事务 开启事务 2 快照读整张表,查到所有数据 3 对id为10的数据进 阅读全文
posted @ 2024-07-17 20:00 Duancf 阅读(163) 评论(0) 推荐(0)
摘要:如何避免主从延迟? 读写分离对于提升数据库的并发非常有效,但是,同时也会引来一个问题:主库和从库的数据存在延迟,比如你写完主库之后,主库的数据同步到从库是需要时间的,这个时间差就导致了主库和从库的数据不一致性问题。这也就是我们经常说的主从同步延迟。 如果我们的业务场景无法容忍主从同步延迟的话,应该如 阅读全文
posted @ 2024-07-23 16:02 Duancf 阅读(136) 评论(0) 推荐(0)
摘要:InnoDB和MyISAM InnoDB和MyISAM是MySQL数据库系统中最常用的两种存储引擎。它们各自拥有不同的特性和优化点,适用于不同的应用场景。以下是它们之间的一些主要区别: 事务支持 InnoDB:支持事务(ACID兼容)。它提供了提交、回滚和崩溃恢复功能,非常适合处理大量的短期事务。I 阅读全文
posted @ 2024-07-24 10:36 Duancf 阅读(49) 评论(0) 推荐(0)
摘要:CHAR与VARCHAR CHAR(M)为固定长度字符串,在定义时指定字符串列长。 VARCHAR(M)是长度可变的字符串,M表示最大列长度,占用的空间为字符串的实际长度加1。 当检索到CHAR值时,尾部的空格将被删除。VARCHAR在值保存和检索时尾部的空格仍保留。 TEXT与BLOB 保存较大文 阅读全文
posted @ 2024-08-06 17:05 Duancf 阅读(18) 评论(0) 推荐(0)
摘要:大家都知道索引分聚集索引和非聚集索引,性别字段因为可重复肯定只能建立非聚集索引,然而因为非聚集索引叶子节点存储的是索引值和聚集索引值,需要回表。所以在性别这种辨别度较低的字段上建立索引,索引树可能只有两个节点,跟线性查找没有太大区别,并且因为回表的存在导致在聚集索引树和非聚集索引树来回切换反而导致查 阅读全文
posted @ 2024-08-07 19:26 Duancf 阅读(293) 评论(0) 推荐(0)
摘要:在SQL中,是否需要将子查询设置为AS temp或其他别名,取决于子查询的具体用途和上下文。以下是一些常见的场景,帮助你判断何时需要使用别名,何时不需要: 1. 作为表的子查询(需要别名): 需要别名的情况:当子查询直接用于FROM子句中,作为一个虚拟表使用时,必须为子查询设置一个别名。这是因为SQ 阅读全文
posted @ 2024-08-13 00:21 Duancf 阅读(63) 评论(0) 推荐(0)
摘要:第一阶段:写入redolog文件,并把redolog的提交状态设置为prepare状态 第二阶段:写入binlog文件,完成之后,把redolog的提交状态设置为commit 为什么两阶段提交能保证一致性 如果第一阶段写redolog的时候崩溃,什么都没写入,这个事务就丢失了 如果第二阶段写入bin 阅读全文
posted @ 2024-08-19 19:02 Duancf 阅读(40) 评论(0) 推荐(0)
摘要:Mysql redolog的刷盘时机 mysql正常关闭的时候 redolog buffer写入超过一半的时候 事务提交的时候 0每次提交事务,redolog留在buffer中不写入磁盘 1每次提交事务,redolog写入磁盘 2每次提交事务,redolog写入操作系统的文件缓存页面 后台线程每隔一 阅读全文
posted @ 2024-08-19 19:25 Duancf 阅读(87) 评论(0) 推荐(0)
摘要:执行一条 select 语句,期间发生了什么? 学习 SQL 的时候,大家肯定第一个先学到的就是 select 查询语句了,比如下面这句查询语句: // 在 product 表中,查询 id = 1 的记录 select * from product where id = 1; 但是有没有想过,My 阅读全文
posted @ 2024-08-22 17:05 Duancf 阅读(140) 评论(0) 推荐(0)
摘要:MySQL中一个B+树能存储多少数据 MySQL中InnoDB页的大小默认是16k。也可以自己进行设置。(计算机在存储数据的时候,最小存储单元是扇区,一个扇区的大小是 512 字节,而文件系统(例如 XFS/EXT4)最小单元是块,一个块的大小是 4KB。 InnoDB 引擎存储数据的时候,是以页为 阅读全文
posted @ 2024-09-04 22:53 Duancf 阅读(130) 评论(0) 推荐(0)
摘要:![image](https://img2024.cnblogs.com/blog/1533409/202409/1533409-20240906222156759-2134473423.png) 阅读全文
posted @ 2024-09-06 22:21 Duancf 阅读(18) 评论(0) 推荐(0)
摘要:慢查询可能的原因 SQL 没加索引 很多时候,我们的慢查询,都是因为没有加索引。如果没有加索引的话,会导致全表扫描的。因此,应考虑在 where 的条件列,建立索引,尽量避免全表扫描。 反例: select * from user_info where name ='捡田螺的小男孩公众号' ; 正例 阅读全文
posted @ 2024-09-07 20:48 Duancf 阅读(77) 评论(0) 推荐(0)
摘要:临键锁 阅读全文
posted @ 2024-09-07 20:11 Duancf 阅读(48) 评论(0) 推荐(0)
摘要:字节面试题 在可重复隔离级别下,这种情况会发生什么? 答案:死锁 下面我们用一个具体的例子来展示: 首先我们有一张这样的表 下面我们来执行一些语句, 可以看到结果输出了,检测到发生了死锁 Deadlock found when trying to get lock; try restarting t 阅读全文
posted @ 2024-09-09 22:24 Duancf 阅读(30) 评论(0) 推荐(0)
摘要:为什么主键索引最好是有序递增的 移动元素。如果主键不是有序递增的,比如一个叶子结点的存储范围是1-10现在已经存储了2-9,现在我们想要插入数据1就必须要把2-9的数据向后移动。 更多的IO。如果主键不是有序递增的,我们可能需要经常访问那些很久之前访问过的节点,甚至是已经被刷回磁盘的页,这样会造成很 阅读全文
posted @ 2024-09-10 13:49 Duancf 阅读(261) 评论(0) 推荐(0)
摘要:https://www.codedump.info/post/20220807-weekly-23/#概论 阅读全文
posted @ 2024-09-10 20:28 Duancf 阅读(22) 评论(0) 推荐(0)
摘要:在 MySQL 中,存储的编码格式与读取的编码格式是可以不同的。如果你的表中存储的是 UTF-8 编码的数据,但客户端想要以 GBK 编码来读取数据,可以通过调整 MySQL 的字符集设置来实现。以下是几种常见的解决方案: 1. 设置客户端连接的字符集 MySQL 提供了在客户端和服务器之间指定字符 阅读全文
posted @ 2024-09-17 22:31 Duancf 阅读(550) 评论(0) 推荐(0)
摘要:limit深分页为什么会变慢? 先看下表结构: CREATE TABLE account ( id int(11) NOT NULL AUTO_INCREMENT COMMENT '主键Id', name varchar(255) DEFAULT NULL COMMENT '账户名', balanc 阅读全文
posted @ 2024-09-17 21:53 Duancf 阅读(72) 评论(0) 推荐(0)
摘要:使用版本号 在 MySQL 中,可以通过使用版本号(Version)来实现乐观锁。一种常见的实现方式是在表中增加一个版本号字段,每次更新数据时,都需要比对版本号。如果版本号一致,表示可以进行更新操作,否则表示其他事务已经修改了数据,需要进行相应的处理。 下面是一个简单的示例,演示如何在 MySQL 阅读全文
posted @ 2024-09-17 13:51 Duancf 阅读(360) 评论(0) 推荐(1)
摘要:简单嵌套循环算法:SNLJ (simple-nested-loop-join) 当我们的join连接字段没有建立索引或者索引失效,并且数据量较小的情况下,可能会使用此算法优化查询,本质上就是循环匹配,连接比如有A表,B表,两个表JOIN的话会拿着A表的连表条件一条一条在B表循环,匹配A表和B表相同的 阅读全文
posted @ 2024-10-01 16:53 Duancf 阅读(69) 评论(0) 推荐(0)
摘要:数据的位置可能发生改变,例如在页分裂,数据插入的时候,如果存储的是数据的位置,那么要经常修改叶子结点的值来保证数据位置的正确性。 主键不会因为数据的插入而改变,比较稳定,所以我们选择存储主键 优化查询,如果要查的数据就是主键,那就可以直接查到,否则还需要解析数据的过程。 阅读全文
posted @ 2024-10-01 17:04 Duancf 阅读(42) 评论(0) 推荐(0)