自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(22)
  • 收藏
  • 关注

原创 《MySQL实战45讲》学习笔记Day17

1:为啥只查一行的语句,也执行这么慢? 查的慢,基本上就是索引使用的问题,和查一行还是N行(N不是巨大),没有必然联系。查一行慢,猜测没有走索引查询,且数据量比较大。 只查询一行的语句,也比较慢,原因从大到小可分为三种情况 第一,MySQL数据库本身被堵住了,比如:系统或网络资源不够; 第二,SQL语句被堵住了,比如:表锁,行锁等,导致存储引擎不执行对应的SQL语句; 第三,确实是索引使用不当,没有走索引; 第四是表中数据的特点导致的,走了索引,但回表次数庞大。

2023-02-02 00:55:55 108

原创 《MySQL实战45讲》学习笔记Day16

对索引字段做函数操作,可能会破坏索引值的有序性,因此优化器就决定放弃走树搜索功能。

2023-01-31 23:58:03 130

原创 《MySQL实战45讲》学习笔记Day15

对于内存表,回表过程只是简单地根据数据行的位置,直接访问内存得到数据,根本不会导致多访问磁盘。优化器没有了这一层顾虑,那么它会优先考虑的,就是用于排序的行越小越好了,所以,MySQL 这时就会选择 rowid 排序。 order by rand() 使用了内存临时表,内存临时表排序的时候使用了 rowid 排序方法。 磁盘临时表那么,是不是所有的临时表都是内存表呢?其实不是的。tmp_table_size 这个配置限制了内存临时表的大小,默认值是 16M。如果临时表大小超过了 tmp_table_size,

2023-01-30 21:44:08 136

原创 《MySQL实战45讲》学习笔记Day14

全字段排序 VS rowid 排序 如果 MySQL 实在是担心排序内存太小,会影响排序效率,才会采用 rowid 排序算法,这样排序过程中一次可以排序更多行,但是需要再回到原表去取数据。 如果 MySQL 认为内存足够大,会优先选择全字段排序,把需要的字段都放到 sort_buffer 中,这样排序后就会直接从内存里面返回查询结果了,不用再回到原表去取数据。这也就体现了 MySQL 的一个设计思想:如果内存够,就要多利用内存,尽量减少磁盘访问。对于 InnoDB 表来说,rowid 排序会要求回表多造成磁

2023-01-29 23:41:55 106

原创 《MySQL实战45讲》学习笔记day13

count() 的实现方式 你首先要明确的是,在不同的 MySQL 引擎中,count() 有不同的实现方式。MyISAM 引擎把一个表的总行数存在了磁盘上,因此执行 count() 的时候会直接返回这个数,效率很高;而 InnoDB 引擎就麻烦了,它执行 count() 的时候,需要把数据一行一行地从引擎里面读出来,然后累积计数。这里需要注意的是,我们在这篇文章里讨论的是没有过滤条件的 count(),如果加了 where 条件的话,MyISAM 表也是不能返回得这么快的。 InnoDB 是索引组织表,主

2023-01-28 23:48:45 108

原创 《MySQL实战45讲》学习笔记Day12

参数 innodb_file_per_table 表数据既可以存在共享表空间里,也可以是单独的文件。这个行为是由参数 innodb_file_per_table 控制的:这个参数设置为 OFF 表示的是,表的数据放在系统共享表空间,也就是跟数据字典放在一起;这个参数设置为 ON 表示的是,每个 InnoDB 表数据存储在一个以 .ibd 为后缀的文件中。从 MySQL 5.6.6 版本开始,它的默认值就是 ON 了。我建议你不论使用 MySQL 的哪个版本,都将这个值设置为 ON。因为,一个表单独存储为一个

2023-01-27 23:49:23 80

原创 《MySQL实战45讲》学习笔记Day11

当内存数据页跟磁盘数据页内容不一致的时候,我们称这个内存页为“脏页”。内存数据写入到磁盘后,内存和磁盘上的数据页的内容就一致了,称为“干净页” 第一种是“redo log 写满了,要 flush 脏页”,这种情况是 InnoDB 要尽量避免的。因为出现这种情况的时候,整个系统就不能再接受更新了,所有的更新都必须堵住。如果你从监控上看,这时候更新数会跌为 0。 第二种是“内存不够用了,要先将脏页写到磁盘”,这种情况其实是常态。InnoDB 用缓冲池(buffer pool)管理内存,缓冲池中的内存页有三种状态

2023-01-27 00:29:07 68

原创 《MySQL实战45讲》学习笔记Day10

使用前缀索引,定义好长度,就可以做到既节省空间,又不用额外增加太多的查询成本。 使用倒序存储和使用 hash 字段这两种方法的异同点。 首先,它们的相同点是,都不支持范围查询。倒序存储的字段上创建的索引是按照倒序字符串的方式排序的,已经没有办法利用索引方式查出身份证号码在[ID_X, ID_Y]的所有市民了。同样地,hash 字段的方式也只能支持等值查询。 它们的区别,主要体现在以下三个方面: 从占用的额外空间来看,倒序存储方式在主键索引上,不会消耗额外的存储空间,而 hash 字段方法需要增加一个字段。当

2023-01-25 23:52:53 96

原创 《MySQL实战45讲》学习笔记Day9

优化器的逻辑 在第一篇文章中,我们就提到过,选择索引是优化器的工作。而优化器选择索引的目的,是找到一个最优的执行方案,并用最小的代价去执行语句。在数据库里面,扫描行数是影响执行代价的因素之一。扫描的行数越少,意味着访问磁盘数据的次数越少,消耗的 CPU 资源越少。 索引选择异常和处理 其实大多数时候优化器都能找到正确的索引,但偶尔你还是会碰到我们上面举例的这两种情况:原本可以执行得很快的 SQL 语句,执行速度却比你预期的慢很多,你应该怎么办呢?一种方法是,像我们第一个例子一样,采用 force index

2023-01-24 21:53:47 123 1

原创 《MySQL实战45讲》学习笔记Day8

查询过程 假设,执行查询的语句是 select id from T where k=5。这个查询语句在索引树上查找的过程,先是通过 B+ 树从树根开始,按层搜索到叶子节点,也就是图中右下角的这个数据页,然后可以认为数据页内部通过二分法来定位记录。 对于普通索引来说,查找到满足条件的第一个记录 (5,500) 后,需要查找下一个记录,直到碰到第一个不满足 k=5 条件的记录。 对于唯一索引来说,由于索引定义了唯一性,查找到第一个满足条件的记录后,就会停止继续检索。 那么,这个不同带来的性能差距会有多少呢?答案

2023-01-24 00:09:23 83

原创 《MySQL实战45讲》学习笔记Day7

事务到底是隔离的还是不隔离的 在 MySQL 里,有两个“视图”的概念: 一个是 view。它是一个用查询语句定义的虚拟表,在调用的时候执行查询语句并生成结果。创建视图的语法是 create view … ,而它的查询方法与表一样。另一个是 InnoDB 在实现 MVCC 时用到的一致性读视图,即 consistent read view,用于支持 RC(Read Committed,读提交)和 RR(Repeatable Read,可重复读)隔离级别的实现。它没有物理结构,作用是事务执行期间用来定义“我能

2023-01-22 22:56:36 81

原创 《MySQL实战45》学习笔记Day6

行锁 MySQL 的行锁是在引擎层由各个引擎自己实现的。但并不是所有的引擎都支持行锁,比如 MyISAM 引擎就不支持行锁。不支持行锁意味着并发控制只能使用表锁,对于这种引擎的表,同一张表上任何时刻只能有一个更新在执行,这就会影响到业务并发度。InnoDB 是支持行锁的,这也是 MyISAM 被 InnoDB 替代的重要原因之一。 顾名思义,行锁就是针对数据表中行记录的锁。这很好理解,比如事务 A 更新了一行,而这时候事务 B 也要更新同一行,则必须等事务 A 的操作完成后才能进行更新。 在 InnoDB

2023-01-22 00:06:10 64

原创 《MySQL实战45讲》学习笔记Day5

根据加锁的范围,MySQL 里面的锁大致可以分成全局锁、表级锁和行锁三类。 全局锁 顾名思义,全局锁就是对整个数据库实例加锁。MySQL 提供了一个加全局读锁的方法,命令是 Flush tables with read lock (FTWRL)。当你需要让整个库处于只读状态的时候,可以使用这个命令,之后其他线程的以下语句会被阻塞:数据更新语句(数据的增删改)、数据定义语句(包括建表、修改表结构等)和更新类事务的提交语句。全局锁的典型使用场景是,做全库逻辑备份。也就是把整库每个表都 select 出来存成文本

2023-01-20 21:46:28 72

原创 《MySQL实战45讲》学习笔记Day4

显然,主键长度越小,普通索引的叶子节点就越小,普通索引占用的空间也就越小。二叉搜索树的特点是:父节点左子树所有结点的值小于父节点的值,右子树所有结点的值大于父节点的值。由于覆盖索引可以减少树的搜索次数,显著提升查询性能,所以使用覆盖索引是一个常用的性能优化手段。在 InnoDB 中,表都是根据主键顺序以索引的形式存放的,这种存储方式的表称为索引组织表。根据上面的索引结构说明,我们来讨论一个问题:基于主键索引和普通索引的查询有什么区别?索引的出现其实就是为了提高数据查询的效率,就像书的目录一样。

2023-01-19 22:28:11 104

原创 《MySQL实战45讲》学习笔记Day3

当数据库上有多个事务同时执行的时候,就可能出现脏读(dirty read)、不可重复读(non-repeatable read)、幻读(phantom read)的问题,为了解决这些问题,就有了“隔离级别”的概念。Oracle 数据库的默认隔离级别其实就是“读提交”,因此对于一些从 Oracle 迁移到 MySQL 的应用,为保证数据库隔离级别的一致,你一定要记得将 MySQL 的隔离级别设置为“读提交”。可重复读是指,一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的。

2023-01-18 23:28:38 87

原创 《MySQL实战45讲》学习笔记Day2

为什么必须有“两阶段提交”呢? 这是为了让两份日志之间的逻辑一致。 redo log 和 binlog 都可以用于表示事务的提交状态,而两阶段提交就是让这两个状态保持逻辑上的一致。

2023-01-17 21:10:50 104

原创 《MySQL实战45讲》学习笔记Day01

Server 层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。而存储引擎层负责数据的存储和提取。其架构模式是插件式的,支持 InnoDB、MyISAM、Memory 等多个存储引擎。现在最常用的存储引擎是 InnoDB,它从 MySQL 5.5.5 版本开始成为了默认存储引擎。或者在一个语句有多表关联(join)的时候,决定各个表的连接顺序。

2023-01-16 23:59:08 77

原创 Docker安装

设置镜像仓库,设置私有库,卸载docker

2022-09-13 12:51:06 90

原创 CentOS安装Nginx

CentOS安装nginx,nginx安装依赖、启动nginx

2022-09-06 00:44:02 727

原创 CentOS安装MySQL5.7

MySQL下载、MySQL配置、MySQL安装依赖

2022-09-06 00:34:34 827

原创 CentOS 7安装Redis

编辑redis配置文件,redis设置开机自启

2022-09-06 00:16:41 261

原创 CentOS 7安装jdk1.8

CentOS 7安装jdk1.8

2022-09-05 23:20:42 313

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除