<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[编程随笔与杂谈]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/z_ryan</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; z_ryan]]></copyright><item><title><![CDATA[MySQL索引优化]]></title><link>https://blog.youkuaiyun.com/z_ryan/article/details/82393148</link><guid>https://blog.youkuaiyun.com/z_ryan/article/details/82393148</guid><author>z_ryan</author><pubDate>Wed, 05 Sep 2018 00:54:32 +0800</pubDate><description><![CDATA[　　在上文中，我们介绍了MySQL中的两种主要的索引–B-Tree索引和Hash索引。虽然使用索引会带来很大程度上的性能优化。但是，索引的不当使用同时也会引起性能的急剧下降。今天我们就来聊聊索引的优化问题。 
　　首先讨论两个问题：



问题



1、为什么要使用索引？

　　谈到为什么要使用索引，大家第一时间想到的就是提升查询效率吧。那除了这个用途之外索引还有其他的用途吗？下面我们就来聊一聊...]]></description><category></category></item><item><title><![CDATA[MySQL支持的索引类型（B-Tree索引、hash索引）]]></title><link>https://blog.youkuaiyun.com/z_ryan/article/details/82322418</link><guid>https://blog.youkuaiyun.com/z_ryan/article/details/82322418</guid><author>z_ryan</author><pubDate>Mon, 03 Sep 2018 01:12:01 +0800</pubDate><description><![CDATA[　　索引，是存储引擎用于快速找到记录的一种数据结构。尤其是在表中的数据量越来越大时，索引对于性能的提升非常关键。今天先聊一聊MySQL支持的两种主要的索引类型。 
  　　 
  　　在MySQL中，存储引擎在使用索引时，会先在索引中找到对应值，然后根据所匹配的索引记录找到对应的数据行。例如：

select name from user where id = 10;


　　若在id列上建有索引...]]></description><category></category></item><item><title><![CDATA[MySQL查询过程剖析]]></title><link>https://blog.youkuaiyun.com/z_ryan/article/details/82262761</link><guid>https://blog.youkuaiyun.com/z_ryan/article/details/82262761</guid><author>z_ryan</author><pubDate>Fri, 31 Aug 2018 22:15:29 +0800</pubDate><description><![CDATA[　　数据库的性能问题是我们一直需要考虑的一个问题。有人可能说建立最好的索引，设计最有的库表结构。但是这些在没有合理的设计查询的基础上，都无法实现高性能。 
　　今天，我们就先聊一聊MySQL的查询过程。下图就是MySQL的查询过程图：



MySQL的查询过程

  
　　 首先，对其中的各个模块做一简单分析： 
　　 



1、客户端/服务端通信协议

　　首先，需要说明的是：MySQL客户...]]></description><category></category></item><item><title><![CDATA[MySQL逻辑架构及工作流程]]></title><link>https://blog.youkuaiyun.com/z_ryan/article/details/82260663</link><guid>https://blog.youkuaiyun.com/z_ryan/article/details/82260663</guid><author>z_ryan</author><pubDate>Fri, 31 Aug 2018 18:43:02 +0800</pubDate><description><![CDATA[　　MySql并不完美，但是却足够灵活，能够适应高要求的环境。同时，MySql既可以嵌入到应用程序中，也可以支持数据仓库、内容索引和部署软件、高可用的冗余系统、在线事务处理系统等各种应用类型。 
　　为了更心如的理解MySql服务器，我们需要理解MySql各部件之间如何协同工作。需要我们去理解它的逻辑架构。下面我们就来介绍一下MySql的逻辑架构：

MySQL的逻辑架构

　　MySQL的最重要...]]></description><category></category></item><item><title><![CDATA[MySql数据库存储引擎（MyISAM与InnoDB）]]></title><link>https://blog.youkuaiyun.com/z_ryan/article/details/81916660</link><guid>https://blog.youkuaiyun.com/z_ryan/article/details/81916660</guid><author>z_ryan</author><pubDate>Tue, 21 Aug 2018 23:54:27 +0800</pubDate><description><![CDATA[　　MySql可以将数据以不同的技术存储在文件（内存）中，这种技术就称为存储引擎。而每一种存储引擎也使用不同的存储机制、索引技巧、锁定水平，最终提供广泛且不同的功能。常见的存储引擎有MyISAM，InnoDB，Memory，Archive等。 
　　本文主要介绍的是：MyISAM与InnoDB。在5.5版本之前，MyISAM是MySQL的默认数据库引擎。虽然性能极佳，但却有一个缺点：不支持事务处理...]]></description><category></category></item><item><title><![CDATA[MySQL删除表操作（delete、truncate、drop的区别）]]></title><link>https://blog.youkuaiyun.com/z_ryan/article/details/81913481</link><guid>https://blog.youkuaiyun.com/z_ryan/article/details/81913481</guid><author>z_ryan</author><pubDate>Tue, 21 Aug 2018 19:53:57 +0800</pubDate><description><![CDATA[　　本文主要讲mysql中三种删除表的操作，delete语句、truncate语句以及drop语句的区别：

简介

delete

1、删除整张表的数据：

delete from table_name;


2、删除部分数据，添加where子句：

delete  from table_name where...;


3、说明 
　　１）、属于DML语言，每次删除一行，都在事务日志中为所删除...]]></description><category></category></item><item><title><![CDATA[C函数的调用过程原理和栈分析]]></title><link>https://blog.youkuaiyun.com/z_ryan/article/details/81029195</link><guid>https://blog.youkuaiyun.com/z_ryan/article/details/81029195</guid><author>z_ryan</author><pubDate>Fri, 13 Jul 2018 12:01:57 +0800</pubDate><description><![CDATA[　　在编程中，相信每个人对函数都不陌生，那么你真正理解函数的调用过程吗？当一个c函数被调用时，一个栈帧(stack frame)是如何被建立，又如何被消除的。本文主要就是来解决这些问题的，不同的操作系统和编译器可能有所不同，本文主要介绍在linux下的gcc编译器。



栈帧

　　我们先来看一下，一个典型的栈帧的样子： 
　　　 
　　首先介绍一下这里面非两个重要的指针：ebp和esp; 
　...]]></description><category></category></item><item><title><![CDATA[深度剖析c语言main函数---main函数的执行顺序]]></title><link>https://blog.youkuaiyun.com/z_ryan/article/details/80985101</link><guid>https://blog.youkuaiyun.com/z_ryan/article/details/80985101</guid><author>z_ryan</author><pubDate>Tue, 10 Jul 2018 14:09:37 +0800</pubDate><description><![CDATA[　　在之前的文章中，介绍了main函数的返回值 和 main函数的传参，本文主要介绍一下main函数的执行顺序。可能有的人会说，这还用说，main函数肯定是程序执行的第一个函数。那么，事实果然如此吗？相信在看了本文之后，会有不一样的认识。



为什么说main（）是程序的入口

　　linux系统下程序的入口是”_start”，这个函数是linux系统库（Glibc）的一部分，当我们的程序和Gl...]]></description><category></category></item><item><title><![CDATA[深度剖析c语言main函数---main函数的参数传递]]></title><link>https://blog.youkuaiyun.com/z_ryan/article/details/80979432</link><guid>https://blog.youkuaiyun.com/z_ryan/article/details/80979432</guid><author>z_ryan</author><pubDate>Tue, 10 Jul 2018 00:20:38 +0800</pubDate><description><![CDATA[　　在上文中，我们主要讲了ｃ语言main函数的返回值问题，本文主要将main函数的参数传递。

main函数传参

　　首先说明的是，可能有些人认为main函数是不可传入参数的，但是实际上这是错误的。main函数可以从命令行获取参数，从而提高代码的复用性。

函数原形

　　为main函数传参时，可选的main函数原形为：

int main(int argc , char* argv[],cha...]]></description><category></category></item><item><title><![CDATA[深度剖析c语言main函数---main函数的返回值]]></title><link>https://blog.youkuaiyun.com/z_ryan/article/details/80979008</link><guid>https://blog.youkuaiyun.com/z_ryan/article/details/80979008</guid><author>z_ryan</author><pubDate>Mon, 09 Jul 2018 23:19:06 +0800</pubDate><description><![CDATA[　　在接下来的几篇博文中，我将对ｃ语言的main函数进行深入的剖析，分别从函数返回值，函数参数，以及函数的执行顺序对main函数作一总结。本文主要聊聊main函数的返回值。

main函数的返回值

　　main函数的返回值用于说明程序的退出状态。如果返回0，则代表程序正常退出。返回其它数字的含义则由系统决定。通常，返回非零代表程序异常退出。



void main（）

　　有一些书上的，都使...]]></description><category></category></item><item><title><![CDATA[网络编程的三个重要信号（SIGHUP ，SIGPIPE，SIGURG）]]></title><link>https://blog.youkuaiyun.com/z_ryan/article/details/80952498</link><guid>https://blog.youkuaiyun.com/z_ryan/article/details/80952498</guid><author>z_ryan</author><pubDate>Sat, 07 Jul 2018 16:25:19 +0800</pubDate><description><![CDATA[　　对于信号的介绍，我再前面的一篇博客中做过专门的总结，感兴趣的可以看看。本文主要介绍在网络编程中几个密切相关的函数：SIGUP，SIGPIPE，SIGURG。

SIGHUP信号

　　在介绍SIGHUP信号之前，先来了解两个概念：进程组和会话。



进程组

　　进程组就是一系列相互关联的进程集合，系统中的每一个进程也必须从属于某一个进程组；每个进程组中都会有一个唯一的 ID(process...]]></description><category></category></item><item><title><![CDATA[两种高效的并发模式]]></title><link>https://blog.youkuaiyun.com/z_ryan/article/details/80870639</link><guid>https://blog.youkuaiyun.com/z_ryan/article/details/80870639</guid><author>z_ryan</author><pubDate>Fri, 06 Jul 2018 18:38:58 +0800</pubDate><description><![CDATA[前言

　　我们都知道，并发编程的目的是让程序“同时”执行多个任务，提高效率。当一个程序是计算密集型的时，并发编程并没有优势，反而由于任务的切换时效率降低。但是，当一个程序是ＩＯ密集型时，采用并发编程会极大地提高cpu的利用率。因为IO操作的速度远远小于cpu的计算速度，所以让程序阻塞与IO操作上会浪费大量的CPU时间。而并发编程可以让阻塞于IO操作的线程主动放弃CPU，将执行权转移到其他线程。 ...]]></description><category></category></item><item><title><![CDATA[Linux网络编程--两种高效的事件处理模式]]></title><link>https://blog.youkuaiyun.com/z_ryan/article/details/80861138</link><guid>https://blog.youkuaiyun.com/z_ryan/article/details/80861138</guid><author>z_ryan</author><pubDate>Wed, 04 Jul 2018 18:14:52 +0800</pubDate><description><![CDATA[前言

　　今天，我们主要介绍一下网络设计模式中的两种事件处理模式，Reactor和Proactor模式。通常使用同步I/O模型(select,poll,epoll等)用来实现Reactor模式，而异步(aio_read或aio_write等)用来实现Proactor模式，不过还可以使用同步来模拟Proactor模式。

Reactor模式



设计思路

　　主线程（I/O处理单元）只负责对I...]]></description><category></category></item><item><title><![CDATA[IO复用的总结及一些问题]]></title><link>https://blog.youkuaiyun.com/z_ryan/article/details/80910610</link><guid>https://blog.youkuaiyun.com/z_ryan/article/details/80910610</guid><author>z_ryan</author><pubDate>Wed, 04 Jul 2018 12:33:18 +0800</pubDate><description><![CDATA[　　在前面的文章中，分别介绍了常用的三种实现ＩＯ多路复用的函数：select、poll、epoll今天对主要是对这三个函数的总结，以及对一些io复用的问题的总结。



总结




  系统调用
  select
  poll
  epoll



  事件集合
  用户通过3个参数（readset、writeset，exceptset）分别传入感兴趣的可读、可写及异常等事件，内核通过对这些参数...]]></description><category></category></item><item><title><![CDATA[IO复用（epoll）]]></title><link>https://blog.youkuaiyun.com/z_ryan/article/details/80890118</link><guid>https://blog.youkuaiyun.com/z_ryan/article/details/80890118</guid><author>z_ryan</author><pubDate>Tue, 03 Jul 2018 23:47:03 +0800</pubDate><description><![CDATA[　　在前面的文章中讲了实现IO复用的两种方式：select和poll。今天主要讲一个更为高效的函数epoll。



epoll

　　epoll能显著提高在大量链接中，只有少量活跃连接时的cpu利用率。因为，首先epoll可以复用监听的文件描述符集合，而不用每次在等待事件之前重新准备被监听的文件描述符集合。其次是因为epoll获取就绪事件时，不用遍历整个监听事件的集合，而是只需要遍历那些被内核I...]]></description><category></category></item><item><title><![CDATA[Ｉ/Ｏ复用（poll）]]></title><link>https://blog.youkuaiyun.com/z_ryan/article/details/80879265</link><guid>https://blog.youkuaiyun.com/z_ryan/article/details/80879265</guid><author>z_ryan</author><pubDate>Mon, 02 Jul 2018 21:27:05 +0800</pubDate><description><![CDATA[　　上文说到的实现ＩＯ复用的函数中的select，本文接着介绍第二种poll。

poll

　　Poll相对于select来说突破了监听的文件描述符上限1024，最大文件描述符是系统所能允许的最大值，可以通过查看proc/sys/fs/file-max文件查看，这个值也可以改（通过limits.conf）。另一方面是实现了监听和就绪事件的分离。其他和select类似，也是在指定时间内轮询一定数量...]]></description><category></category></item><item><title><![CDATA[Ｉ/Ｏ多路复用(select)]]></title><link>https://blog.youkuaiyun.com/z_ryan/article/details/80879210</link><guid>https://blog.youkuaiyun.com/z_ryan/article/details/80879210</guid><author>z_ryan</author><pubDate>Mon, 02 Jul 2018 21:18:47 +0800</pubDate><description><![CDATA[　　在之前写过一篇五种I/O模型，感兴趣的可以去看一下，今天主要讲其中的一种，那就是I/O多路复用。因为I/O多路复用可以使一个进程同时处理多个连接。这对提高程序的性能至关重要。对于IO复用的概念与理解在上文说的挺清楚了。本文主要说实现IO复用的系统调用。 
　　在linux下，实现IO复用的系统调用主要有三个：select、poll 和 epoll，下面我们将对其进行逐一讲解。



selec...]]></description><category></category></item><item><title><![CDATA[linux五种IO模型]]></title><link>https://blog.youkuaiyun.com/z_ryan/article/details/80873449</link><guid>https://blog.youkuaiyun.com/z_ryan/article/details/80873449</guid><author>z_ryan</author><pubDate>Sun, 01 Jul 2018 12:43:36 +0800</pubDate><description><![CDATA[　　为了更好的理解五种IO模型，我们先来说一下几个概念：同步，异步，阻塞和非阻塞。



同步和异步

　　这两个概念与消息的通知机制有关。



同步

　　所谓同步，就是在发出一个功能调用时，在没有得到结果之前，该调用就不返回。比如，调用readfrom系统调用时，必须等待IO操作完成才返回。 

异步

　　异步的概念和同步相对。当一个异步过程调用发出后，调用者不能立刻得到结果。实际处理这个...]]></description><category></category></item><item><title><![CDATA[详解二叉树的非递归遍历]]></title><link>https://blog.youkuaiyun.com/z_ryan/article/details/80854233</link><guid>https://blog.youkuaiyun.com/z_ryan/article/details/80854233</guid><author>z_ryan</author><pubDate>Fri, 29 Jun 2018 11:18:20 +0800</pubDate><description><![CDATA[本文转载自：http://blog.youkuaiyun.com/zhangxiangdavaid/article/details/37115355



前言

　　对于二叉树的递归遍历比较简单，所以本文主要讨论的是非递归版。其中，中序遍历的非递归写法最简单，后序遍历最难。 
节点的定义：

//Binary Tree Node
typedef struct node
{
    int data;
   ...]]></description><category></category></item><item><title><![CDATA[浅析dup()和dup2()函数]]></title><link>https://blog.youkuaiyun.com/z_ryan/article/details/80851739</link><guid>https://blog.youkuaiyun.com/z_ryan/article/details/80851739</guid><author>z_ryan</author><pubDate>Fri, 29 Jun 2018 09:05:24 +0800</pubDate><description><![CDATA[前言

　　在linux下，一切皆文件。当文件被打开时，会返回文件描述符用于操作该文件，从shell中运行一个进程，默认会有3个文件描述符存在(0、１、2)；）0表示标准输入，1表示标准输出，2表示标准错误。一个进程当前有哪些打开的文件描述符可以通过/proc/进程ID/fd目录查看。

　　今天，我们主要说两个用于复制文件描述符的函数dup()和dup2()。

dup()、dup2()函数

...]]></description><category></category></item></channel></rss>