- 博客(91)
- 资源 (2)
- 收藏
- 关注
原创 gdb coredump怎么用
参考博客: http://blog.chinaunix.net/uid-26675482-id-5549007.html https://blog.youkuaiyun.com/wkd_007/article/details/79757289 https://www.cnblogs.com/youxin...
2021-08-07 14:56:53
288
原创 自增 主键
我们前面提到过自增主键,由于自增主键可以让主键索引尽量地保持递增顺序插入,避免了页分裂,因此索引更紧凑。自增值的实现机制1.存储 表定义里面出现了一个 AUTO_INCREMENT=2,表示下一次插入数据时,如果需要自动生成自增值,会生成 id=2。这个输出结果容易引起这样的误解:自增值是保存在表结构定义里的。实际上,表的结构定义存放在后缀名为.frm 的文件中,但是并不会保存自增值。不同的引擎对于自增值的保存策略不同:a. MyISAM 引擎的自增值保存在数据文件中...
2021-01-22 17:41:49
4035
原创 insert 语句会碰到哪些锁
insert … select 语句例子:CREATE TABLE `t` ( `id` int(11) NOT NULL AUTO_INCREMENT, `c` int(11) DEFAULT NULL, `d` int(11) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `c` (`c`)) ENGINE=InnoDB;insert into t values(null, 1,1);insert into t values
2021-01-22 17:37:31
1609
原创 MySQL临时表
今天说到的临时跟前面文章说的内部临时表还是有区别的。临时表的特点和应用1.特点首先来理清楚内存表和临时表的区别:内存表,指的是使用 Memory 引擎的表,建表语法是 create table … engine=memory。这种表的数据都保存在内存里,系统重启的时候会被清空,但是表结构还在。除了这两个特性看上去比较“奇怪”外,从其他的特征上看,它就是一个正常的表。 而临时表,可以使用各种引擎类型 。如果是使用 InnoDB 引擎或者 MyISAM 引擎的临时表,写数据的时候是写到磁盘..
2021-01-21 18:16:56
354
原创 union 和 group by 怎么执行
例子:create table t1(id int primary key, a int, b int, index(a)); 从1开始递增插入1000行数据。union执行比如:(select 1000 as f) union (select id from t1 order by id desc limit 2);它的语义是,取这两个子查询结果的并集。并集的意思就是这两个集合加起来,并且去重。第二行的 key=PRIMARY,说明第二个子句用到了索引 id。 第三行的 Extra.
2021-01-21 09:46:51
4160
原创 join查询 和 性能优化
在实际生产中,关于 join 语句使用的问题,一般会集中在以下两类:我们 DBA 不让使用 join,使用 join 有什么问题呢? 如果有两个大小不同的表做 join,应该用哪个表做驱动表呢?拿出例子说事儿:CREATE TABLE `t2` ( `id` int(11) NOT NULL, `a` int(11) DEFAULT NULL, `b` int(11) DEFAULT NULL, PRIMARY KEY (`id`), KEY `a` (`a`)) ENG
2021-01-20 17:34:40
960
原创 MySQL大查询的问题
我们经常会遇到这样的问题,我的主机内存只有 100G,现在要对一个 200G 的大表做全表扫描,会不会把数据库主机的内存用光了?这个问题确实值得担心,被系统 OOM(out of memory)可不是闹着玩的。但是,反过来想想,逻辑备份的时候,可不就是做整库扫描吗?如果这样就会把内存吃光,逻辑备份不是早就挂了?所以说,对大表做全表扫描,看来应该是没问题的。但是,这个流程到底是怎么样的呢?全表扫描对 server 层的影响我们已经知道,InnoDB 的数据是保存在主键索引上的,所以全表扫描实际上是
2021-01-19 20:01:16
367
原创 幻读 和 间隙锁(Gap Lock)
幻读幻读是什么举例说明:CREATE TABLE `t` ( `id` int(11) NOT NULL, `c` int(11) DEFAULT NULL, `d` int(11) DEFAULT NULL, PRIMARY KEY (`id`), KEY `c` (`c`)) ENGINE=InnoDB;insert into t values(0,0,0),(5,5,5),(10,10,10),(15,15,15),(20,20,20),(25,25,25);
2021-01-19 15:39:58
3383
7
原创 grant之后要跟着flush privileges吗?
内容来源:林晓斌《MySQL实战45讲》在 MySQL 里面,grant 语句是用来给用户赋权的。在一些操作文档里面会提到,grant 之后要马上跟着执行一个 flush privileges 命令,才能使赋权语句生效。我最开始使用 MySQL 的时候,就是照着一个操作文档的说明按照这个顺序操作的。那么,grant 之后真的需要执行 flush privileges 吗?如果没有执行这个 flush 命令的话,赋权语句真的不能生效吗?先创建一个用户:create user 'ua'@'%' ide.
2021-01-18 11:59:37
270
1
原创 select只查一行的语句,执行慢的原因
需要说明的是,如果 MySQL 数据库本身就有很大的压力,导致数据库服务器 CPU 占用率很高或 ioutil(IO 利用率)很高,这种情况下所有语句的执行都有可能变慢,不属于我们今天的讨论范围。第一类:查询长时间不返回一般碰到这种情况的话,大概率是表 t 被锁住了。接下来分析原因的时候,一般都是首先执行一下 show processlist 命令,看看当前语句处于什么状态。等 MDL 锁出现这个状态表示的是,现在有一个线程正在表 t 上请求或者持有 MDL 写锁,把 select
2021-01-15 19:38:35
1565
原创 select查询中 条件字段函数操作、隐式类型转换、隐式字符编码转换
条件字段函数操作拿出例子:mysql> CREATE TABLE `tradelog` ( `id` int(11) NOT NULL, `tradeid` varchar(32) DEFAULT NULL, `operator` int(11) DEFAULT NULL, `t_modified` datetime DEFAULT NULL, PRIMARY KEY (`id`), KEY `tradeid` (`tradeid`), KEY `t_modifi
2021-01-15 14:50:35
1029
原创 MySQL随机排序的正确姿势
有个表结构:CREATE TABLE `words` ( `id` int(11) NOT NULL AUTO_INCREMENT, `word` varchar(64) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB;表里面插入了 10000 行记录,要从中随机选择 3 个单词。最简单的方法mysql> select word from words order by rand() limit 3;虽然这个 SQL 语句写...
2021-01-15 11:57:19
5404
原创 order by 内部算法原理
在你开发应用的时候,一定会经常碰到需要根据指定的字段排序来显示结果的需求。比如:select city,name,age from t where city='杭州' order by name limit 1000 ; city字段是普通索引全字段排序看看执行结果:Extra 这个字段中的“Using filesort”表示的就是需要排序,MySQL 会给每个线程分配一块内存用于排序,称为 sort_buffer。通常情况下,这个语句执行流程如下所示 :初始化 sort...
2021-01-14 18:03:02
553
原创 从简单的 count(*)深入理解MySQL
从问题出发在开发系统的时候,你可能经常需要计算一个表的行数,比如一个交易系统的所有变更记录总数。这时候你可能会想,一条 select count(*) from t 语句不就解决了吗?但是,你会发现随着系统中记录数越来越多,这条语句执行得也会越来越慢。然后你就疑惑,MySQL为什么不记个总数,每次要查的时候直接读出来?我们来聊聊 count(*) 语句到底是怎样实现的,以及 MySQL 为什么会这么实现。然后,我会再和你说说,如果应用中有这种频繁变更并需要统计表行数的需求,业务设计上可以怎么..
2021-01-14 12:40:31
361
原创 谈谈 MySQL的刷盘过程 和 表数据
先来看第一个问题,SQL语句变慢原因分析一条 SQL 语句,正常执行的时候特别快,但是有时也不知道怎么回事,它就会变得特别慢,并且这样的场景很难复现,它不只随机,而且持续时间还很短,像抖了一下。我们通常的更新语句,只做了更新内存数据页并写redolog的写磁盘动作,但是内存中的脏页总得跟新到磁盘中,也就是flush的动作。这个flush,就会影响到SQL语句的操作。总结一下引发 flush的场景:InnoDB 的 redo log 写满了。这时候系统会停止所有更新操作,把 che...
2021-01-13 19:55:07
1353
原创 MySQL 锁机制
数据库锁设计的初衷是处理并发问题。作为多用户共享的资源,当出现并发访问的时候,数据库需要合理地控制资源的访问规则。根据加锁的范围,MySQL 里面的锁大致可以分成全局锁、表级锁和行锁三类。全局锁它对整个数据库实例加锁。MySQL 提供了一个加全局读锁的方法,命令是 Flush tables with read lock (FTWRL)。当你需要让整个库处于只读状态的时候,可以使用这个命令,之后其他线程的以下语句会被阻塞:数据更新语句(数据的增删改)、数据定义语句(包括建表、修改表结构等)和更新类
2021-01-12 19:50:40
287
1
原创 InnoDB 事务机制
事务就是要保证一组数据库操作,要么全部成功,要么全部失败。在 MySQL 中,事务支持是在引擎层实现的。你现在知道,MySQL 是一个支持多引擎的系统,但并不是所有的引擎都支持事务。比如 MySQL 原生的 MyISAM 引擎就不支持事务,这也是 MyISAM 被 InnoDB 取代的重要原因之一。当数据库上有多个事务同时执行的时候,就可能出现脏读(dirty read)、不可重复读(non-repeatable read)、幻读(phantom read)的问题,这样就有了“隔离级别”的概念。SQL
2021-01-08 16:19:00
220
原创 MySQL中InnoDB的索引细则
一般意义上的索引索引的出现其实就是为了提高数据查询的效率,就像书的目录一样。实现索引的方式也有很多种,这里简单介绍一下索引的几种模型:哈希表,基于哈希表实现,适用于只有等值查询的场景。 有序数组,在等值查询和范围查询场景中的性能就都非常优秀,但是插入成本极高,只适用于静态存储引擎。 二叉搜索树,特点是:父节点左子树所有结点的值小于父节点的值,右子树所有结点的值大于父节点的值。查询时间复杂度是 O(log(N)),更新时间复杂度是 O(log(N))。二叉树是搜索效率最高的,但是实际上大多数的数据
2020-12-15 10:51:35
441
原创 MySQL的三大日志:redo log、undo log、 binlog
mysql的日志分为几大类:错误日志、查询日志、慢查询日志、事务日志(redo log和undolog)、二进制日志(binlog)。binlog用于记录数据库执行的写入性操作(不包括查询)信息,以二进制的形式保存在磁盘中。binlog是mysql的逻辑日志(可理解为记录的就是sql语句),并且由Server层进行记录,使用任何存储引擎的mysql数据库都会记录binlog日志。用途:复制:MySQL Replication在Master端开启binlog,Master把它的二进制日...
2020-12-03 16:10:21
924
1
原创 从一条 select 查询 看MySQL后台架构
本博客阅读自林晓斌的《MySQL实战45讲》。SQL语句:select *from T where ID=10;MySQL的逻辑架构图: Server 层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。而存储引擎层负责数据的存储和提取。其架构模式是插件...
2020-12-01 12:36:04
195
转载 linux内核劫持
/* ============================================================================ Name : hellomod.c Author : Hava Version : 0.0.0.0 Copyright : Copyright by 2011 Description : Hello World in C, Ansi-style ===========================.
2020-09-02 09:09:22
539
1
原创 sscanf 的一个坑
在一次项目中,偶然使用了sscanf,这里就不详细说明它的用法,开门见山,说一下本文的意图,也希望其他同族兄弟了解。上程序代码:struct xxx{ unsigned char a[6]; char b[16];};int main(int argc, char** argv){ struct xxx xyz; memset(&xyz, 0, sizeof(struct xxx)); strcp...
2020-07-15 15:30:06
1864
原创 制作内核 rpm 包 - centos7.8
网上的资料参差不齐,有懂的没说清楚,有不懂只是在瞎转发。这里呢,本人也不是很懂,但是制作内核rpm包的这条路走通了。这里的场景是,在系统新建一个内核网络模块test_rpm,但是呢,在内核协议栈、tun/tap驱动中又有一些定制化的修改。1. 先从官网下载kernel的rpm安装包说起:yum install -y asciidoc audit-libs-devel bash bc binutils binutils-devel bison diffutils elfutils elfutil.
2020-07-15 10:52:54
1296
转载 如何通过数据包套接字攻击Linux内核?
一、前言最近我花了一些时间使用syzkaller工具对Linux内核中与网络有关的接口进行了模糊测试(fuzz)。除了最近发现的DCCP套接字漏洞之外,我还发现了另一个漏洞,该漏洞位于数据包套接字(packet sockets)中。在这篇文章中,我会向大家介绍这个漏洞的发现过程,以及我们如何利用这个漏洞来提升权限。该漏洞本身(CVE-2017-7308)是一个符号类型漏洞,...
2020-04-24 11:18:29
1106
原创 Linux网络编程:自己动手写高性能HTTP服务器框架(三)
buffer对象buffer,顾名思义,就是一个缓冲区对象,缓存了从套接字接收来的数据以及需要发往套接字的数据。如果是从套接字接收来的数据,事件处理回调函数在不断地往 buffer 对象增加数据,同时,应用程序需要不断把 buffer 对象中的数据处理掉,这样,buffer 对象才可以空出新的位置容纳更多的数据。如果是发往套接字的数据,应用程序不断地往 buffer 对象增加数据,同时...
2020-03-23 21:53:42
428
1
原创 Linux网络编程 - 子线程使用poll处理连接 I/O事件(高并发高性能进阶篇)
这一篇我们就将 acceptor 上的连接建立事件和已建立连接的 I/O 事件分离,形成所谓的主 - 从 reactor 模式。主 - 从 reactor 模式主 - 从这个模式的核心思想是,主反应堆线程只负责分发 Acceptor 连接建立,已连接套接字上的 I/O 事件交给 sub-reactor 负责分发。其中 sub-reactor 的数量,可以根据 CPU 的核数来灵活设置。...
2020-03-03 21:02:19
1438
1
原创 Linux网络编程 - poll 单线程处理所有I/O事件(高并发高性能设计)
事件驱动模型事件驱动的好处是占用资源少,效率高,可扩展性强,是支持高性能高并发的不二之选。前面已经提到,通过使用 poll、epoll 等 I/O 分发技术,可以设计出基于套接字的事件驱动程序,从而满足高性能、高并发的需求。事件驱动模型,也被叫做反应堆模型(reactor),或者是 Event loop 模型。这个模型的核心有两点:它存在一个无限循环的事件分发线程,或者叫做 react...
2020-03-03 19:14:51
557
1
原创 Linux网络编程 - C10K问题:高并发模型的设计初篇
C10K问题这一篇,借着C10K 问题,系统地梳理一下高性能网络编程的方法论。C10K 问题是这样的:如何在一台物理机上同时服务 10000 个用户?这里 C 表示并发,10K 等于 10000。得益于操作系统、编程语言的发展,在现在的条件下,普通用户使用 Java Netty、Libevent 等框架或库就可以轻轻松松写出支持并发超过 10000 的服务器端程序,甚至于经过优化之后可以...
2020-03-02 16:38:07
478
1
原创 Linux网络编程 - epoll
下面有一张图,这张图来自 The Linux Programming Interface(No Starch Press)。它直观地为我们展示了 select、poll、epoll 几种不同的 I/O 复用技术在面对不同文件描述符大小时的表现差异。 从图中可以明显地看到,epoll 的性能是最好的,即使在多达 10000 个文件描述的情况下,其性能的下降和...
2020-02-29 21:22:11
463
1
原创 Linux网络编程 - 另一种I/O多路复用:poll
上一讲我们讲到了 I/O 多路复用技术,并以 select 为核心,展示了 I/O 多路复用技术的能力。select 方法是多个 UNIX 平台支持的非常常见的 I/O 多路复用技术,但是它有一个缺点,那就是所支持的文件描述符的个数是有限的。在 Linux 系统中,select 的默认最大值为 1024。poll 函数和 select 相比,poll 和内核交互的数据结构有所变化,另外,也...
2020-02-27 18:37:11
215
1
原创 Linux网络编程 - 检查数据的有效性
在前面,我们仔细分析了引起故障的原因,并且已经知道为了应对可能出现的各种故障,必须在程序中做好防御工作。...
2020-02-25 19:13:52
285
1
kernel-3.10.0-1127.el7.src.rpm
2020-07-15
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人