技术细节

  • 作者:mail
    来自:TaobaoDBA 2009年9月2日星期三
    摘要:本文介绍了XtraBackup的安装(编译安装)和使用。Xtrabackup是一个对InnoDB做数据备份的工具,支持在线热备份(备份时不影响数据读写),是商业备份工具InnoDB Hotbackup的一个很好的替代品。本文测试使用的是0.8版本,与当前最新版本是0.9区别并不大。Xtrabackup有两个主要的工具:xtrabackup、innobackupex,其中xtrabackup只能备份InnoDB和XtraDB两种数据表,innobackupex则封装了xtrabackup,同时可以备份MyISAM数据表。本文仅仅介绍了innobackupex的备份和恢复。

    (more…)

  • innodb_flush_method 与 File I/O

    ·

    陶方在《innodb_flush_method带来的性能影响》中从实验角度比较了fdatasync,O_DSYNC和O_DIRECT在性能上的差异。本文将试图从Linux/Unix”文件I/O”(unbuffered I/O)的角度来解释innodb_flush_method是如何影响MySQL的I/O。【附录1】

    innodb_flush_log_at_trx_commit 参数确定日志文件 何时 write、flush。innodb_flush_method则确定日志及数据文件 如何 write、flush。在Linux下,innodb_flush_method 可以取如下值:fdatasync, O_DSYNC, O_DIRECT,那这三个值分别是如何影响文件写入的?首先我们需要先来了解Linux的文件I/O是如何工作的。

    (more…)
  • sphinx使用介绍(前篇)

    ·

    到今天为止校内论坛Discuz)上的主题数量已经到达了40w,所有回复约500W。随着数据量的增大,DZ自带的站内搜索给数据库的带来的压力越来越大,甚至会导致数据库停止服务(MyISAM在SLOW Query和update并发问题)。取代站内搜索,我们使用了google的自定义搜索服务,google的速度非常快,但是对于论坛来说,Google不能返回实时的搜索结果,而且也无法定制搜索(如安装标题、作者、内容)。

    所以,我们将尝试使用sphinx来解决这个问题。先看看sphinx是怎样工作的: (more…)

  • InnoDB之Dirty page、Redo log

    ·

    在InnoDB中,buffer pool里面的dirty page一方面可以加快数据处理速度,同时也会造成数据的不一致(RAM vs DISK)。本文介绍了dirty page是如何产生,以及InnoDB如何利用redo log如何消除dirty page产生的数据不一致。

    1. 当事务(Transaction)需要修改某条记录(row)时,InnoDB需要将该数据所在的page从disk读到buffer pool中,事务提交后,InnoDB修改page中的记录(row)。这时buffer pool中的page就已经和disk中的不一样了,我们称buffer pool中的page为dirty page。Dirty page等待flush到disk上。
      dirty_pages
      (more…)
  • 在php中常见的计算字符串长度的函数有:strlen和mb_strlen,下面是对这两个函数的比较说明(编码方式UTF8)

    比较strlen和mb_strlen

    当字符全是英文字符的时候,两者是一样。这里主要比较一下,中英文混排的时候,两个计算结果。(测试时编码方式是UTF8)

    $str='中文a字1符';
    echo strlen($str);
    echo '';
    echo mb_strlen($str,'UTF8');
    //输出结果
    //14
    //6

    结果分析:在strlen计算时,对待一个UTF8的中文字符是3个长度,所以“中文a字1符”长度是 3*4+2=14。

    在mb_strlen计算时,选定内码为UTF8,则会将一个中文字符当作长度1来计算,所以“中文a字1符”长度是6。

    关于中英文混排串的占位符计算

    利用这两个函数则可以联合计算出一个中英文混排的串的占位是多少(一个中文字符的占位是2,英文字符是1),计算的方法是:如果一个混排字符串有a个中文,b个英文,占位是:

    $str='中文a字1符';
    //计算如下
    echo ( strlen($str) + mb_strlen($str,'UTF8') ) / 2;
    //输出结果
    //10

    例如  “中文a字1符” 的strlen($str)值是14,mb_strlen($str)值是6,则可以计算出“中文a字1符”的占位是 10 。

    最大占位计算

    一般的英文字符占位要比中文小一些,例如,可能两个英文字符的宽度才是一个中文字符的宽度,所以,当我们允许 max 个中文字符宽度的时候,可以使用类似入如下的计算,计算总宽度:

    $$
    3*x + y = \text{strlen} \\
    x + y = \text{mb_strlen} \\
    2x = \text{strlen} – \text{mb_strlen} \\
    x = \frac{\text{strlen} – \text{mb_strlen}}{2} \\
    z*\frac{x}{x+y}*2 + z*\frac{y}{x+y} \le MAX \\
    z \le \frac{MAX*(x+y)}{(2x+y)} = \frac{MAX*(\text{mb_strlen})}{(2x+y)} = \frac{MAX*(\text{mb_strlen})}{( \frac{\text{strlen} + \text{mb_strlen}}{2} )} \\
    = \frac{2*MAX*(\text{mb_strlen})}{( \text{strlen} + \text{mb_strlen} )} \\
    $$