• 前篇介绍了MySQL如何从SQL语句转换成一个内部对象。本文是前篇的延续,将更加详细的介绍WHERE语句对应的Item对象。

    1. Item对象@MySQL Internal

    (建议阅读:The Item Class@MySQL Internals Manual,忽略本小结)

    MySQL Internals Manual较为详细的介绍了Item对象。Item对象经常被称作”thingamabob”( A thingamabob is a noun used to describe items that either you can’t remember the name of or that don’t actually exist.)。Item是一个类,每一个Item实例都:(1)代表一个SQL语句里的对象;(2)有取值;(3)有数据类型指针。

    下面列出的的SQL相关的对象都是一个Item对象,或者继承至Item:(1)一段字符; (2)数据表的某列; (3)一个局部或全局变量; (4)一个存储过程的变量; (5) 一个用户参数; (6)一个函数/存储过程(这包括运算符+、||、=、like等) 。例如下面的SQL语句: (more…)

  • update@2013年12月04日:改版后没有了”未读邮件”应该很不适应吧,可以通过搜索框搜索”label:unread”查看所有未读邮件

    这是一个自己列举的使用技巧: 级别:随便用用 ** 设置回复为回复全部:不用每次都选择回复全部:) 级别:一天一次 ** 搞个主题玩玩 ** 使用紧凑模式 ** 知道如何撤销3秒前的误操作 ** 搞一个签名吧 级别:重度用户 ** 设置五颜六色的标签 ** 设置单页会话数量 ** 使用Mutex让一些会话安静 ** 使用一些Gmail插件管理Gmail ** 帮你代收所有其他的邮件 ** 设置默认的发件地址,这样不用每次写邮件时都需要选择邮件地址 ** 当你有多个收发地址的时候:选择Reply from the same address the message was sent to ** 修改一个页面中显示的会话数量 (more…)
  • 自从有了微薄后博客就写得少了,上一篇博客已经是6月份写的了… 从写第一篇关于MySQL源码的文章之后也已经过了很久,继续上路。

    优化器是关系数据库的一个重要而有特色的部分,优化器的理论和实践也多半也都很复杂,本系列文章希望通过解析MySQL优化器,来用好MySQL,扬其长,避其短。顺便也一窥关系数据库优化器的实现思路。文章将重点介绍重要的数据结构和数据结构之间的关系,而不是侧重于代码(”Bad programmers worry about the code. Good programmers worry about data structures and their relationships.”)。

    0 写在前面

    本文解决了什么问题:希望通过这些文章能够帮你更加顺畅的理解MySQL优化器的行为;在你阅读MySQL源代码之前了解更多的背后思路。

    本文不解决什么问题:教你如何读懂源代码;

    这个系列很长,大概按这样的思路进行下去: 基本的数据结构、语法解析、JOIN的主要算法、JOIN顺序和单表访问。数据结构(以及他们的关系)和算法流程总是相互穿插介绍。

    建议阅读:参考文献中的文章和书籍,都建议在阅读本文之前阅读。

    1 SQL语句解析基础

    1.1 语法解析基础/Flex与Bison

    MySQL语法解析封装在函数MYSQLparser中完成。跟其他的语法解析器一样,它包含两个模块:词法分析(Lexical scanner)和语法规则(Grammar rule module)。词法分析将整个SQL语句打碎成一个个单词(Token),而语法规则模块则根据MySQL定义的语法规则生成对应的数据结构,并存储在对象THD->LEX结构当中。最后优化器,根据这里的数据,生成执行计划,再调用存储引擎接口执行。

    词法分析和语法规则模块有两个较成熟的开源工具Flex和Bison分别用来解决这两个问题。MySQL出于性能和灵活考虑,选择了自己完成词法解析部分,语法规则部分使用Bison。词法解析和Bison沟通的核心函数是由词法解析器提供的函数接口yylex(),在Bison中,必要的时候调用yylex()获得词法解析的数据,完成自己的语法解析。Bison的入口时yyparse(),在MySQL中是,MYSQLParse。

    如果对词法分析和语法规则模块感到陌生,建议阅读参考文献[4][5][6]先注1,否则很难理解整个架构,或者至少会有很强的断层感。而且,根据Bison的Action追踪MySQL数据的存储结构是很有效的。 (more…)

  • Gmail使用技巧

    今天心情很郁闷,写篇博客缓解一下吧。

    这是一个自己列举的使用技巧:

    随便用用(低频)
    ** 设置回复为回复全部

    一天一次的使用者(高频)
    ** 搞个主题玩玩
    ** 使用紧凑模式
    ** 知道如何撤销3秒前的误操作
    ** 搞一个签名吧

    重度用户
    ** 设置五颜六色的标签
    ** 设置单页会话数量
    ** 使用Mutex让一些会话安静
    ** 使用一些Gmail插件管理Gmail
    ** 帮你代收邮件
    ** 设置默认的发件地址,这样不用每次写邮件时都需要选择邮件地址
    ** 当你有多个收发地址的时候:选择Reply from the same address the message was sent to
    ** 修改一个页面中显示的会话数量

    Gmail上瘾者
    ** 使用Google Task管理日常
    ** 使用一个Google Task的插件管理
    ** 高级快捷键使用
    ** 设置回复时的默认字体
    ** 尝试新的实验室特性,并且告诉需要的朋友们

    Gmail的缺点:
    从一个技术人员的角度看,真没想到什么缺点

    整理完才发现,Gmail比较符合个人对一个完美产品的定义.

  • 在MySQL服务器出现短暂(5~30秒)的性能波动的时候,一般的性能监控工具都很难抓住故障现场,也就很难收集对应较细粒度的诊断信息。另外,如果这种波动出现的频率很低,例如几天才一次,我们也很难人为的抓住现场,收集数据。这正是pt-stalk所解决的问题。

    pt-stalk是Percona-Toolkit的一部分(其前身是Aspersa的一部分)。安装Percona-Toolkit后,可以通过man pt-stalk了解如何使用该工具,本文的介绍是man pt-stalk的一个子集,强烈建议直接阅读man pt-stalk。额外的,本文将提供pt-stalk示例命令可供参考。

    1. 使用pt-stalk

    pt-stalk --collect-tcpdump --function status \
    --variable Threads_connected --threshold 2500 \
    --daemonize -- --user=root --password=YOURPASSWORD

    上面的命令表示,让pt-stalk后台运行(–daemonize),并监视SHOW GLOBAL STATUS中的Threads_connected状态值,如果该值超过2500,则触发收集主机和MySQL的性能、状态信息。pt-stalk会每隔一秒检查一次状态值,如果连续5次满足触发条件,则开始收集。

    –collect-tcpdump表示除了收集基本信息外,还将额外使用tcpdump收集当时的网络包,类似的还可以使用–collect-gdb等。

    (more…)
  • 不止一次需要这么做了。

    如果你需要的扩展在yum/apt仓库中没有的话,那需要自己编译了。

    1. 下载PHP5.2.9的源代码(根据你php的版本选择)
    2. 编译模块

    进入对应模块的源码目录,然后:phpize、configure、make

    $tar zxvf tar zxvf php-5.2.9.tar.gz $cd php-5.2.9/ext/curl $phpize Configuring for: PHP Api Version: 20041225 Zend Module Api No: 20060613 Zend Extension Api No: 220060519 $./configure --with-php-config=/opt/php/bin/php-config checking for egrep... grep -E checking for a sed that does not truncate output... /bin/sed ...... configure: creating ./config.status config.status: creating config.h $make ...... Build complete. Don't forget to run 'make test'.
    3.将扩展文件(.so)cp到php的扩展目录

    扩展目录的位置可以通过phpinfo的输出结果看到,也可以在php.ini文件中看到。

    例如:

    cp modules/sockets.so /home/admin/php/ext/

    然后编辑php.ini文件

    ; extension_dir directive above.
    extension_dir = “/home/admin/php/ext/”
    extension=memcache.so
    extension=curl.so
    extension=rrdtool.so
    extension=oci8.so
    extension=sockets.so
    4. 重启你的apache,Job done

    可以通过phpinfo()来的输出来查看是否成功安装对应的模块。

    参考:Compiling shared PECL extensions with phpize