自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(91)
  • 资源 (2)
  • 收藏
  • 关注

原创 gdb coredump怎么用

参考博客: http://blog.chinaunix.net/uid-26675482-id-5549007.html https://blog.csdn.net/wkd_007/article/details/79757289 https://www.cnblogs.com/youxin...

2021-08-07 14:56:53 238

原创 自增 主键

我们前面提到过自增主键,由于自增主键可以让主键索引尽量地保持递增顺序插入,避免了页分裂,因此索引更紧凑。自增值的实现机制1.存储 表定义里面出现了一个 AUTO_INCREMENT=2,表示下一次插入数据时,如果需要自动生成自增值,会生成 id=2。这个输出结果容易引起这样的误解:自增值是保存在表结构定义里的。实际上,表的结构定义存放在后缀名为.frm 的文件中,但是并不会保存自增值。不同的引擎对于自增值的保存策略不同:a. MyISAM 引擎的自增值保存在数据文件中...

2021-01-22 17:41:49 3684

原创 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 1417

原创 MySQL临时表

今天说到的临时跟前面文章说的内部临时表还是有区别的。临时表的特点和应用1.特点首先来理清楚内存表和临时表的区别:内存表,指的是使用 Memory 引擎的表,建表语法是 create table … engine=memory。这种表的数据都保存在内存里,系统重启的时候会被清空,但是表结构还在。除了这两个特性看上去比较“奇怪”外,从其他的特征上看,它就是一个正常的表。 而临时表,可以使用各种引擎类型 。如果是使用 InnoDB 引擎或者 MyISAM 引擎的临时表,写数据的时候是写到磁盘..

2021-01-21 18:16:56 226

原创 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 3857

原创 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 873

原创 MySQL大查询的问题

我们经常会遇到这样的问题,我的主机内存只有 100G,现在要对一个 200G 的大表做全表扫描,会不会把数据库主机的内存用光了?这个问题确实值得担心,被系统 OOM(out of memory)可不是闹着玩的。但是,反过来想想,逻辑备份的时候,可不就是做整库扫描吗?如果这样就会把内存吃光,逻辑备份不是早就挂了?所以说,对大表做全表扫描,看来应该是没问题的。但是,这个流程到底是怎么样的呢?全表扫描对 server 层的影响我们已经知道,InnoDB 的数据是保存在主键索引上的,所以全表扫描实际上是

2021-01-19 20:01:16 300

原创 幻读 和 间隙锁(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 3170 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 223 1

原创 select只查一行的语句,执行慢的原因

需要说明的是,如果 MySQL 数据库本身就有很大的压力,导致数据库服务器 CPU 占用率很高或 ioutil(IO 利用率)很高,这种情况下所有语句的执行都有可能变慢,不属于我们今天的讨论范围。第一类:查询长时间不返回一般碰到这种情况的话,大概率是表 t 被锁住了。接下来分析原因的时候,一般都是首先执行一下 show processlist 命令,看看当前语句处于什么状态。等 MDL 锁出现这个状态表示的是,现在有一个线程正在表 t 上请求或者持有 MDL 写锁,把 select

2021-01-15 19:38:35 1353

原创 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 912

原创 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 4883

原创 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 473

原创 从简单的 count(*)深入理解MySQL

从问题出发在开发系统的时候,你可能经常需要计算一个表的行数,比如一个交易系统的所有变更记录总数。这时候你可能会想,一条 select count(*) from t 语句不就解决了吗?但是,你会发现随着系统中记录数越来越多,这条语句执行得也会越来越慢。然后你就疑惑,MySQL为什么不记个总数,每次要查的时候直接读出来?我们来聊聊 count(*) 语句到底是怎样实现的,以及 MySQL 为什么会这么实现。然后,我会再和你说说,如果应用中有这种频繁变更并需要统计表行数的需求,业务设计上可以怎么..

2021-01-14 12:40:31 310

原创 谈谈 MySQL的刷盘过程 和 表数据

先来看第一个问题,SQL语句变慢原因分析一条 SQL 语句,正常执行的时候特别快,但是有时也不知道怎么回事,它就会变得特别慢,并且这样的场景很难复现,它不只随机,而且持续时间还很短,像抖了一下。我们通常的更新语句,只做了更新内存数据页并写redolog的写磁盘动作,但是内存中的脏页总得跟新到磁盘中,也就是flush的动作。这个flush,就会影响到SQL语句的操作。总结一下引发 flush的场景:InnoDB 的 redo log 写满了。这时候系统会停止所有更新操作,把 che...

2021-01-13 19:55:07 1141

原创 MySQL 锁机制

数据库锁设计的初衷是处理并发问题。作为多用户共享的资源,当出现并发访问的时候,数据库需要合理地控制资源的访问规则。根据加锁的范围,MySQL 里面的锁大致可以分成全局锁、表级锁和行锁三类。全局锁它对整个数据库实例加锁。MySQL 提供了一个加全局读锁的方法,命令是 Flush tables with read lock (FTWRL)。当你需要让整个库处于只读状态的时候,可以使用这个命令,之后其他线程的以下语句会被阻塞:数据更新语句(数据的增删改)、数据定义语句(包括建表、修改表结构等)和更新类

2021-01-12 19:50:40 239 1

原创 InnoDB 事务机制

事务就是要保证一组数据库操作,要么全部成功,要么全部失败。在 MySQL 中,事务支持是在引擎层实现的。你现在知道,MySQL 是一个支持多引擎的系统,但并不是所有的引擎都支持事务。比如 MySQL 原生的 MyISAM 引擎就不支持事务,这也是 MyISAM 被 InnoDB 取代的重要原因之一。当数据库上有多个事务同时执行的时候,就可能出现脏读(dirty read)、不可重复读(non-repeatable read)、幻读(phantom read)的问题,这样就有了“隔离级别”的概念。SQL

2021-01-08 16:19:00 187

原创 MySQL中InnoDB的索引细则

一般意义上的索引索引的出现其实就是为了提高数据查询的效率,就像书的目录一样。实现索引的方式也有很多种,这里简单介绍一下索引的几种模型:哈希表,基于哈希表实现,适用于只有等值查询的场景。 有序数组,在等值查询和范围查询场景中的性能就都非常优秀,但是插入成本极高,只适用于静态存储引擎。 二叉搜索树,特点是:父节点左子树所有结点的值小于父节点的值,右子树所有结点的值大于父节点的值。查询时间复杂度是 O(log(N)),更新时间复杂度是 O(log(N))。二叉树是搜索效率最高的,但是实际上大多数的数据

2020-12-15 10:51:35 342

原创 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 790 1

原创 从一条 select 查询 看MySQL后台架构

本博客阅读自林晓斌的《MySQL实战45讲》。SQL语句:select *from T where ID=10;MySQL的逻辑架构图: Server 层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。而存储引擎层负责数据的存储和提取。其架构模式是插件...

2020-12-01 12:36:04 148

转载 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 464

原创 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 1273

原创 制作内核 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 1125

转载 如何通过数据包套接字攻击Linux内核?

一、前言最近我花了一些时间使用syzkaller工具对Linux内核中与网络有关的接口进行了模糊测试(fuzz)。除了最近发现的DCCP套接字漏洞之外,我还发现了另一个漏洞,该漏洞位于数据包套接字(packet sockets)中。在这篇文章中,我会向大家介绍这个漏洞的发现过程,以及我们如何利用这个漏洞来提升权限。该漏洞本身(CVE-2017-7308)是一个符号类型漏洞,...

2020-04-24 11:18:29 893

原创 Linux网络编程:自己动手写高性能HTTP服务器框架(三)

buffer对象buffer,顾名思义,就是一个缓冲区对象,缓存了从套接字接收来的数据以及需要发往套接字的数据。如果是从套接字接收来的数据,事件处理回调函数在不断地往 buffer 对象增加数据,同时,应用程序需要不断把 buffer 对象中的数据处理掉,这样,buffer 对象才可以空出新的位置容纳更多的数据。如果是发往套接字的数据,应用程序不断地往 buffer 对象增加数据,同时...

2020-03-23 21:53:42 370 1

原创 Linux网络编程:自己动手写高性能HTTP服务器框架(二)

I/O模型和多线程模型实现多线程设计的几个考虑...

2020-03-20 19:10:45 309 1

原创 Linux网络编程:自己动手写高性能HTTP服务器框架(一)

需求总结

2020-03-19 20:47:52 335 1

原创 Linux网络编程 - 剖析 epoll 的底层实现

基本数据结构...

2020-03-17 21:28:02 479 2

原创 Linux网络编程 - 异步 I/O 的探讨

概念...

2020-03-13 18:27:57 405 1

原创 Linux网络编程 - 子线程使用poll处理连接 I/O事件(高并发高性能进阶篇)

这一篇我们就将 acceptor 上的连接建立事件和已建立连接的 I/O 事件分离,形成所谓的主 - 从 reactor 模式。主 - 从 reactor 模式主 - 从这个模式的核心思想是,主反应堆线程只负责分发 Acceptor 连接建立,已连接套接字上的 I/O 事件交给 sub-reactor 负责分发。其中 sub-reactor 的数量,可以根据 CPU 的核数来灵活设置。...

2020-03-03 21:02:19 1391 1

原创 Linux网络编程 - poll 单线程处理所有I/O事件(高并发高性能设计)

事件驱动模型事件驱动的好处是占用资源少,效率高,可扩展性强,是支持高性能高并发的不二之选。前面已经提到,通过使用 poll、epoll 等 I/O 分发技术,可以设计出基于套接字的事件驱动程序,从而满足高性能、高并发的需求。事件驱动模型,也被叫做反应堆模型(reactor),或者是 Event loop 模型。这个模型的核心有两点:它存在一个无限循环的事件分发线程,或者叫做 react...

2020-03-03 19:14:51 474 1

原创 Linux网络编程 - 阻塞I/O 的进程模型 和 线程模型

阻塞I/O的进程模型阻塞I/O的线程模型...

2020-03-03 18:27:15 417 1

原创 Linux网络编程 - C10K问题:高并发模型的设计初篇

C10K问题这一篇,借着C10K 问题,系统地梳理一下高性能网络编程的方法论。C10K 问题是这样的:如何在一台物理机上同时服务 10000 个用户?这里 C 表示并发,10K 等于 10000。得益于操作系统、编程语言的发展,在现在的条件下,普通用户使用 Java Netty、Libevent 等框架或库就可以轻轻松松写出支持并发超过 10000 的服务器端程序,甚至于经过优化之后可以...

2020-03-02 16:38:07 400 1

原创 Linux网络编程 - epoll

下面有一张图,这张图来自 The Linux Programming Interface(No Starch Press)。它直观地为我们展示了 select、poll、epoll 几种不同的 I/O 复用技术在面对不同文件描述符大小时的表现差异。 从图中可以明显地看到,epoll 的性能是最好的,即使在多达 10000 个文件描述的情况下,其性能的下降和...

2020-02-29 21:22:11 414 1

原创 Linux网络编程 - 非阻塞I/O

阻塞 VS 非阻塞...

2020-02-28 19:00:26 250 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 185 1

原创 Linux网络编程 - select

I/O 多路复用...

2020-02-26 21:04:08 303 1

原创 Linux网络编程 - 检查数据的有效性

在前面,我们仔细分析了引起故障的原因,并且已经知道为了应对可能出现的各种故障,必须在程序中做好防御工作。...

2020-02-25 19:13:52 238 1

原创 Linux网络编程 - TCP并不总是可靠的

TCP的不可靠性...

2020-02-21 21:15:22 289 1

原创 Linux网络编程 - 如何理解TCP的“流”?

TCP 是一种流式协议...

2020-02-18 19:05:26 352 1

kernel-3.10.0-1127.el7.src.rpm

你想学习linux内核吗,源码是关键,学习完linux内核知识点后,还要找一个感兴趣模块知悉阅读,就能以点带面,深入理解。绝对官网资源!

2020-07-15

数据结构与算法,C语言

正在学习数据结构和算法,内容还不错,各位要耐心下来学习,一定会有的收货。另外,就看不惯高资源分的,重在分享!

2018-03-07

空空如也

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

TA关注的人

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