mysql
文章平均质量分 76
小辣鸡~
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
为什么我的mysql会抖一下?
什么情况下会发生数据库的flush操作?1.粉板满了,记不下了,对应的就是redo log写满了,这时候系统需要停止所有更新操作。2.这一天生意太好,要记住的事情太多,掌柜发现自己快记不住了,赶紧找个账本把孔乙己这笔帐先加进去。这种场景对应系统内存不足,当需要新的数据页,而内存不够用的时候,就要淘汰一些数据页,空出的内存给别的数据页使用。如果淘汰的是脏页。就要先把脏页写入到磁盘中的。你一定会说,这个时候难道不能把内存直接淘汰掉,下次再请求的时候,从磁盘读入数据页,然后拿redo log出来应用不就可原创 2022-04-23 15:28:03 · 643 阅读 · 0 评论 -
mysql为什么表数据删除了,表文件大小还不变?
数据删除流程假设我们要删除R4这条记录,innodb只会把R4这条记录标记为删除。如果之后再插入一个ID在300到600之间的记录的时候,可能会复用这个位置。但是磁盘大小并不会缩小。我们现在知道delete命令其实只是把记录的位置,或者数据页标记为了可复用,但磁盘大小不会发生改变。如何才能删除空洞呢?通过重建表的方式,重建表的流程:1.建立一个临时文件,扫描表A主键的所有数据页2.用数据页中表A的记录数生成B+树,存储到临时文件中3.生成临时文件的过程中,将所有对A的操作都记录到row lo原创 2022-04-18 23:31:17 · 1236 阅读 · 0 评论 -
mysql锁
MySQL的锁大致分为三类:全局锁、表锁、行锁全局锁当你需要让整个数据库处于只读状态的时候,可以使用这个命令,之后其他线程的以下语句都会被阻塞:数据更新语句(数据的增删改)、数据定义语句(包括建表、修改表结构等)和更新类事务提交语句。全局锁的典型使用场景是做全库逻辑备份。(因为如果不加锁的话,就不能保证数据的一致性)。也就是说不加锁的话,备份系统备份得到的库不是一个逻辑时间点,这个视图的逻辑是不一致的。如何保证视图的一致呢?如果是事务的话,可重复读就可以保证一致性。官方自带的逻辑备份工具是mys原创 2022-04-16 10:14:03 · 174 阅读 · 0 评论 -
mysql基础架构
mysql基础架构MySQL可以分为server层和存储引擎层两部分。Server层为图中上面绿框的部分。所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。存储引擎层负责数据的存储和提取。其架构模式是插件式的,支持innodb、MyISAM、Memory等连接器连接器负责跟客户端建立连接、获取权限、维持和管理连接。我们可以通过show processlist查看此时建立的连接。sleep代表此时系统有一个空闲的连接。如果客户端太长时间没动静,连接器就会自动断开,时间由wait原创 2022-04-10 16:02:25 · 707 阅读 · 0 评论 -
order by是如何工作的?
CREATE TABLE `t` ( `id` int(11) NOT NULL, `city` varchar(16) NOT NULL, `name` varchar(16) NOT NULL, `age` int(11) NOT NULL, `addr` varchar(128) DEFAULT NULL, PRIMARY KEY (`id`), KEY `city` (`city`)) ENGINE=InnoDB;select city,name,age from原创 2022-03-13 10:12:51 · 1507 阅读 · 0 评论 -
我查这么多数据,会不会把内存打爆?
全表扫描对server层的影响mysql -h$host -P$port -u$user -p$pwd -e "select * from db1.t" > $target_fileinnodb的数据保存在主键索引上,所以全表扫描就是直接扫描表t的主键索引。然后查询的每一行可以直接放到结果集里,然后返回给客户端。这个结果集存放在哪里呢?实际上,服务器并不需要保存一个完整的结果集。取数据和发数据的流程是这样的:1.获取一行写入到net_buffer中。2.重复获取行,直到把net_buff原创 2022-03-06 11:06:14 · 499 阅读 · 0 评论 -
为什么我只查询一行语句,也执行这么慢?
第一类:查询长时间不返回一般这种情况是表t被锁住了,首先需要执行以下show processlist命令,看一下语句处于什么状态。1.等MDL锁出现这种状态代表一个线程正在表t上请求或者持有MDL写锁,把select语句堵住了。由于通过show processlist查看到的结果中sessionA的command列处于sleep状态,导致查找起来不方便,所以可以通过查询sys.schema_table_lock_waits这张表,就可以直接找到阻塞的process id2.等flush出现W原创 2022-03-02 22:10:34 · 225 阅读 · 0 评论 -
MySQL锁
MySQL中的锁大致可以分为全局锁、表级锁、行锁全局锁加全局锁的命令:Flush tables with read lock全局锁主要的使用场景就是全局备份。例如下图如果不加全局锁的话,会存在如下问题:购买课程的操作,如果数据库是先备份余额表然后此时用户购买,然后数据库再备份用户课程表的话,就会出现我没有花钱但是多了一门课程的情况。也就是说,如果不加锁的话,备份系统备份的得到的库不是一个逻辑时间点,这个视图是逻辑不一致的。官方自带的逻辑备份工具是mysqldump。当mysqldump使用参原创 2022-02-23 23:19:53 · 363 阅读 · 0 评论
分享