关联数组(associative array)

关联数组(associative array )是一种常用的抽象数据类型。它有很多别名,例如associative container , map , mapping , dictionary , finite map , table,index 等。它的特点是由一个关键字和其他各种属性组成的集合。典型的操作包括插入,删除和查找等。而用于描述关联数组最常用的是哈希表hash table )和自平衡二叉搜索树(self-balanced binary search tree )(包括红黑树red-black tree )和avl树avl tree ),有时可能使用B-tree (适用于关联数组太大的情况,比如数据库等))。哈希表和自平衡二叉搜索树的性能对比如下:平均情况下哈希表的查找和插入操作的复杂度为O(1),而自平 衡二叉搜索树的查找和插入操作的复杂度为O(log(n))。而最坏情况下平衡二叉搜索树的查找和插入操作的复杂度仍为O(log(n)),而哈希表的查 找和插入操作的复杂度可能达到O(n)。

   相关链接直接参考维基百科中内容即可,另有一篇中文的文章也不错,链接:

   红黑树的介绍和实现

   由于c语言标准库中缺乏对各种抽象数据类型的支持,c语言下对各种抽象数据类型的操作比较麻烦,从网上找了一些C语言的数据结构库,感兴趣的可以看看:

   GDSL

   GNUlib

   sglib

   attractive chaos 's klib

   c-geniric-library

   cbase

   libwayne

   uthash (hash table)

   ccan

MySQL日期函数From_unixtime及UNIX_TIMESTAMP及DATE_FORMAT

后者只能格式化标准日期格式,时间戳的不行
 

from_unixtime()是MySQL里的时间函数
date为需要处理的参数(该参数是Unix 时间戳),可以是字段名,也可以直接是Unix 时间戳字符串
后面的 '%Y%m%d' 主要是将返回值格式化
例如:
mysql>SELECT FROM_UNIXTIME( 1249488000, '%Y%m%d' )  
->20071120
mysql>SELECT FROM_UNIXTIME( 1249488000, '%Y年%m月%d' )
->2007年11月20
UNIX_TIMESTAMP() 是与之相对正好相反的时间函数

UNIX_TIMESTAMP(), UNIX_TIMESTAMP(date)

   若无参数调用,则返回一个 Unix timestamp ('1970-01-01 00:00:00' GMT 之后的秒数) 作为无符号整数。若用date 来调用 UNIX_TIMESTAMP(),它会将参数值以'1970-01-01 00:00:00' GMT后的秒数的形式返回。date 可以是一个 DATE 字符串、一个 DATETIME字符串、一个 TIMESTAMP或一个当地时间的YYMMDD 或YYYMMDD格式的数字。

例如:

mysql> SELECT UNIX_TIMESTAMP() ; (执行使得时间:2009-08-06 10:10:40)
->1249524739
mysql> SELECT UNIX_TIMESTAMP('2009-08-06') ;
->1249488000

SELECT *
FROM `student`
WHERE regTime > UNIX_TIMESTAMP( curdate( ) ) //
今天所有学生注册记录。

Linux下递归删除目录下所有exe文件

  1. find . -name '*.exe' -type f -print -exec rm -rf {} \; 
(1) "."    表示从当前目录开始递归查找

(2) “ -name '*.exe' "根据名称来查找,要查找所有以.exe结尾的文件夹或者文件

(3) " -type f "查找的类型为文件

(4) "-print" 输出查找的文件目录名

(5) 最主要的是是-exec了,-exec选项后边跟着一个所要执行的命令,表示将find出来的文件或目录执行该命令。

     exec选项后面跟随着所要执行的命令或脚本,然后是一对儿{},一个空格和一个\,最后是一个分号


如何在Linux下创建与解压zip, tar, tar.gz和tar.bz2文件

这么多年来,数据压缩对我们来说是非常有用的。无论是在邮件中发送的图片用的zip文件 还是在服务器压缩数据文件,我们都可以让下载更容易或者有效的节约磁盘空间。某些压缩格式有时允许我们以60%的比率(甚至更高)压缩文件。下面我将会给 大家演示如何用这些命令在Linux下面去压缩文件或者目录。我们将学习zip, tar, tar.gz和tar.bz2等压缩格式的基本用法。这几个是在Linux里面常用的压缩格式。

 

在我们探究这些用法之前,我想先跟大家分享一下使用不同压缩格式的经验。当然,我这里讲到的只是其中的一些用法,除我讲到的之外,他们还有更多的地 方值得我们探讨。我已经意识到我需要了解两到三种压缩格式,才能更好的使用他们。zip格式是第一个需要了解的格式。因为它实际上已成为压缩文件的标准选 择,而且它在windows上也能使用。我经常用zip格式压缩那些需要共享给windows用户的文件。如果只是共享给linux用户或者Mac用户, 那我偏向于选择tar.gz格式。

 

ZIP
zip可能是目前使用得最多的文档压缩格式。它最大的优点就是在不同的操作系统平台,比如Linux, Windows以及Mac OS,上使用。缺点就是支持的压缩率不是很高,而tar.gz和tar.gz2在压缩率方面做得非常好。闲话少说,我们步入正题吧:
我们可以使用下列的命令压缩一个目录:

# zip -r archive_name.zip directory_to_compress

下面是如果解压一个zip文档:

# unzip archive_name.zip
 

TAR
Tar是在Linux中使用得非常广泛的文档打包格式。它的好处就是它只消耗非常少的CPU以及时间去打包文件,他仅仅只是一个打包工具,并不负责压缩。下面是如何打包一个目录:

# tar -cvf archive_name.tar directory_to_compress

如何解包:

# tar -xvf archive_name.tar.gz

上面这个解包命令将会将文档解开在当前目录下面。当然,你也可以用这个命令来捏住解包的路径:

# tar -xvf archive_name.tar -C /tmp/extract_here/
 

TAR.GZ
这种格式是我使用得最多的压缩格式。它在压缩时不会占用太多CPU的,而且可以得到一个非常理想的压缩率。使用下面这种格式去压缩一个目录:

# tar -zcvf archive_name.tar.gz directory_to_compress

解压缩:

# tar -zxvf archive_name.tar.gz

上面这个解包命令将会将文档解开在当前目录下面。当然,你也可以用这个命令来捏住解包的路径:

# tar -zxvf archive_name.tar.gz -C /tmp/extract_here/
 

TAR.BZ2
这种压缩格式是我们提到的所有方式中压缩率最好的。当然,这也就意味着,它比前面的方式要占用更多的CPU与时间。这个就是你如何使用tar.bz2进行压缩。

# tar -jcvf archive_name.tar.bz2 directory_to_compress

上面这个解包命令将会将文档解开在当前目录下面。当然,你也可以用这个命令来捏住解包的路径:

# tar -jxvf archive_name.tar.bz2 -C /tmp/extract_here/

数据压缩是非常有用的,尤其是对于备份来说。所以,你现在应该考虑在你的备份脚本中使用你在这里学到的压缩方式备份你基本的规则文件以减小你备份文件的大小。

过段时间之后,你就会意识到,在压缩率与CPU占用时间上会有一个平衡,你也要学会如何去权衡什么时候你需要一个快但是压缩率低,什么时候需要一个压缩率高但是CPU点用高的压缩方式,然后你才能避免无谓的空间与时间。

 

Linux设置系统时间

我们一般使用“date -s”命令来修改系统时间。比如将系统时间设定成20066年10月19日的命令如下。
#date -s 19/10/2006
将系统时间设定成下午1点12分0秒的命令如下。
#date -s 13:12:00
---- 注意,这里说的是系统时间,是linux由操作系统维护的。
---- 在系统启动时,Linux操作系统将时间从CMOS中读到系统时间变量中,以后修改时间通过修改系统时间实现。为了保持系统时间与CMOS时间的一致性, Linux每隔一段时间会将系统时间写入CMOS。由于该同步是每隔一段时间(大约是11分钟)进行的,在我们执行date -s后,如果马上重起机器,修改时间就有可能没有被写入CMOS,这就是问题的原因。如果要确保修改生效可以执行如下命令。
---- #clock -w
---- 这个命令强制把系统时间写入CMOS。
 
[root@mail ~]# date --help
Usage: date [OPTION]... [+FORMAT]
  or:  date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]
Display the current time in the given FORMAT, or set the system date.
  -d, --date=STRING         display time described by STRING, not `now'
  -f, --file=DATEFILE       like --date once for each line of DATEFILE
  -ITIMESPEC, --iso-8601[=TIMESPEC]  output date/time in ISO 8601 format.
                            TIMESPEC=`date' for date only,
                            `hours', `minutes', or `seconds' for date and
                            time to the indicated precision.
                            --iso-8601 without TIMESPEC defaults to `date'.
  -r, --reference=FILE      display the last modification time of FILE
  -R, --rfc-2822            output RFC-2822 compliant date string
  -s, --set=STRING          set time described by STRING
  -u, --utc, --universal    print or set Coordinated Universal Time
      --help     显示此帮助信息并离开
      --version  显示版本信息并离开
FORMAT controls the output.  The only valid option for the second form
specifies Coordinated Universal Time.  Interpreted sequences are:
  %%   a literal %
  %a   locale's abbreviated weekday name (Sun..Sat)
  %A   locale's full weekday name, variable length (Sunday..Saturday)
  %b   locale's abbreviated month name (Jan..Dec)
  %B   locale's full month name, variable length (January..December)
  %c   locale's date and time (Sat Nov 04 12:02:33 EST 1989)
  %C   century (year divided by 100 and truncated to an integer) [00-99]
  %d   day of month (01..31)
  %D   date (mm/dd/yy)
  %e   day of month, blank padded ( 1..31)
  %F   same as %Y-%m-%d
  %g   the 2-digit year corresponding to the %V week number
  %G   the 4-digit year corresponding to the %V week number
  %h   same as %b
  %H   hour (00..23)
  %I   hour (01..12)
  %j   day of year (001..366)
  %k   hour ( 0..23)
  %l   hour ( 1..12)
  %m   month (01..12)
  %M   minute (00..59)
  %n   a newline
  %N   nanoseconds (000000000..999999999)
  %p   locale's upper case AM or PM indicator (blank in many locales)
  %P   locale's lower case am or pm indicator (blank in many locales)
  %r   time, 12-hour (hh:mm:ss [AP]M)
  %R   time, 24-hour (hh:mm)
  %s   seconds since `00:00:00 1970-01-01 UTC' (a GNU extension)
  %S   second (00..60); the 60 is necessary to accommodate a leap second
  %t   a horizontal tab
  %T   time, 24-hour (hh:mm:ss)
  %u   day of week (1..7);  1 represents Monday
  %U   week number of year with Sunday as first day of week (00..53)
  %V   week number of year with Monday as first day of week (01..53)
  %w   day of week (0..6);  0 represents Sunday
  %W   week number of year with Monday as first day of week (00..53)
  %x   locale's date representation (mm/dd/yy)
  %X   locale's time representation (%H:%M:%S)
  %y   last two digits of year (00..99)
  %Y   year (1970...)
  %z   RFC-2822 style numeric timezone (-0500) (a nonstandard extension)
  %Z   time zone (e.g., EDT), or nothing if no time zone is determinable
By default, date pads numeric fields with zeroes.  GNU date recognizes
the following modifiers between `%' and a numeric directive.
  `-' (hyphen) do not pad the field
  `_' (underscore) pad the field with spaces
Report bugs to <bug-coreutils@gnu.org>.

tmpfs

tmpfs是什么

tmpfs是一种基于内存的文件系统,它和虚拟磁盘(ramdisk)比较像,但不一样。

和ramdisk一样,tmpfs可以使用您的RAM,但它也可以使用您的swap分区来存储。而且传统的ramdisk是个块设备,要用mkfs来格式化它,才能真正地使用它;而tmpfs是一个文件系统,并不是块设备,只是安装它,就可以使用了。有人说,tmpfs是最好的基于RAM的文件系统。
 

tmpfs 和VM(虚拟内存)

Linux内核的虚拟内存资源同时来源于您的RAM和交换分区。内核中的VM子系统将这些资源分配到系统中的其它部分,并负责在后台管理这些资源,通常是透明地将RAM页移动到交换分区或从交换分区到RAM页。
tmpfs文件系统需要VM子系统的页面来存储文件。tmpfs自己并不知道这些页面是在交换分区还是在RAM中;做这种决定是VM子系统的工作。tmpfs文件系统所知道的就是它正在使用某种形式的虚拟内存。
不同于大多数“标准的”文件系统,如ext3、ReiserFS和其它一些系统,tmpfs并不是存在于一个底层块设备上面。因为tmpfs是直接建立在VM之上的,您用一个简单的mount命令就可以创建tmpfs文件系统了。

# mount tmpfs /mnt/tmpfs -t tmpfs
 

tmpfs 的优势

动态文件系统大小
/mnt/tmpfs最初会只有很小的空间,但随着文件的复制和创建,tmpfs文件系统驱动程序会分配更多的 VM,并按照需求动态地增加文件系统的空间。而且,当 /mnt/tmpfs 中的文件被删除时,tmpfs 文件系统驱动程序会动态地减小文件系统并释放 VM 资源,这样做可以将 VM 返回到循环当中以供系统中其它部分按需要使用。因为 VM 是宝贵的资源,所以您一定不希望任何东西浪费超出它实际所需的 VM,tmpfs 的好处之一就在于这些都是自动处理的。
速度快

tmpfs 的另一个主要的好处是它闪电般的速度。因为典型的 tmpfs 文件系统会完全驻留在 RAM 中,读写几乎可以是瞬间的。即使用了一些交换分区,性能仍然是卓越的,当更多空闲的 VM 资源可以使用时,这部分 tmpfs 文件系统会被移动到 RAM 中去。让 VM 子系统自动地移动部分 tmpfs 文件系统到交换分区实际上对性能上是好的,因为这样做可以让 VM 子系统为需要 RAM 的进程释放空间。这一点连同它动态调整大小的能力,比选择使用传统的 RAM 磁盘可以让操作系统有好得多的整体性能和灵活性。
 

使用 tmpf

默认情况下,tmpfs会mount到/dev/shm目录。使用tmpfs,就是说你可以使用这个目录,这个目录就是tmpfs,如你写临时文件到此目录,这些文件实际上是在VM中。
要使用tmpfs,您要在内核配置时,启用“Virtual memory file system support”。
为防止tmpfs使用了全部VM,有时候要限制其大小。要创建一个最大为32 MB的tmpfs文件系统,键入:
# mount tmpfs /dev/shm -t tmpfs -o size=32m
添加到 /etc/fstab,应该是这样:

tmpfs /dev/shm tmpfs size=32m 0 0
 

安装eaccelerator加速PHP

一、安装eaccelerator-0.9.5
  
  1、首先下载并安装ZendOptimizer-3.3.9
       把ZendOptimizer.so COPY到一个目录,执行以下命令:
      chcon -t texrel_shlib_t /usr/lib/ZendOptimizer.so 
      execstack -c /usr/lib/ZendOptimizer.so 
      service httpd restart
      service mysqld restart
     基本上可以OK。
  
  2、再安装eaccelerator-0.9.6加速软件
  
  # wget http://bart.eaccelerator.net/source/0.9.6/eaccelerator-0.9.6.tar.bz2

  # tar jxvf eaccelerator-0.9.6.tar.bz2
  # cd eaccelerator-0.9.6
  #  phpize
  # ./configure --enable-eaccelerator=shared --with-php-config=/usr/bin/php-config
  # make
  # make install
  
  这时会将eaccelerator安装到php目录中,屏幕会显示eaccelerator.so所在路径,例如:
  Installing shared extensions:  /usr/lib/php/modules  记住这个路径。

     安装完成后需要修改/etc/ld.so.conf

     #vim /etc/lod.so.conf

  再最后一行添加 include /usr/lib/php/modules/*.so 后保存退出
  
  eaccelerator即可以安装为PHP扩展,也可以安装为zend扩展,以下安装为PHP扩展。
  
  在最后一行加入以下内容

01 [eaccelerator]
02 extension="eaccelerator.so"
03 eaccelerator.shm_size="16"
04 eaccelerator.cache_dir="tmp/eaccelerator"
05 eaccelerator.enable="1"
06 eaccelerator.Optimizer="1"
07 eaccelerator.check_mttime="1"
08 eaccelerator.debug="0"
09 eaccelerator.filter=""
10 eaccelerator.shm_max="0"
11 eaccelerator.shm_ttl="0"
12 eaccelerator.shm_prune_period="0"
13 eaccelerator.shm_only="0"
14 eaccelerator.compress="1"
15 eaccelerator.compress_level="9"

  
  建立缓存目录:
  # mkdir -p /tmp/eaccelerator
  # chmod 777 /tmp/eaccelerator
  
  重启Apache:
  # service httpd restart
  
  
  3、检查ZendOptimizer和eaccelerator是否安装成功
  
  创建一个phpinfo.php文件,内容如下:
  <?php
      phpinfo();
  ?>
  
  将该文件放置到网站目录,在浏览器中访问,如果出现以下内容则安装成功:
  This program makes use of the Zend Scripting Language Engine:
  Zend Engine v2.2.0, Copyright (c) 1998-2007 Zend Technologies
      with eAccelerator v0.9.5, Copyright (c) 2004-2006 eAccelerator, by eAccelerator
      with Zend Extension Manager v1.0.11, Copyright (c) 2003-2006, by Zend Technologies
      with Zend Optimizer v3.2.2, Copyright (c) 1998-2006, by Zend Technologies
  
  
  
  二、eaccelerator配置信息详解(根据官方英文说明翻译)
  
  extension="/data/webserver/php/lib/php/extensions/no-debug-zts-20060613/eaccelerator.so"
  
  解释:PHP扩展eaccelerator.so的路径。
  
  --------------------
  
  eaccelerator.shm_size="32"
  
  解释:eaccelerator可使用的共享内存大小(单位为MB)。
  
  在Linux下,单个进程的最大内存使用量受/proc/sys/kernel/shmmax中设置的数字限制(单位为字节),例如CentOS 4.4的shmmax默认值为33554432字节(33554432bytes/1024/1024=32MB)。
  
  临时更改该值:
  # echo 字节数 > /proc/sys/kernel/shmmax
  
  按照以上方法更改,在每次重启系统时,该值会被自动还原。如果想永久更改,可以修改/etc/sysctl.conf文件,设置:
  kernel.shmmax = 字节数
  
  --------------------
  
  eaccelerator.cache_dir="/data/cache/eaccelerator"
  
  解释:缓存路径,可以使用命令mkdir -p /data/cache/eaccelerator创建该目录,然后使用命令chmod 0777 /data/cache/eaccelerator设置该目录权限为0777
  
  --------------------
  
  eaccelerator.enable="1"
  
  解释:打开或者关闭eaccelerator。"1"指打开,"0"指关闭。默认值为"1"。
  
  --------------------
  
  eaccelerator.optimizer="1"
  
  解释:打开或者关闭代码优化,开启可以加快代码的执行速度。"1"指打开,"0"指关闭。默认值为"1"。
  
  --------------------
  
  eaccelerator.check_mtime="1"
  
   解释:当打开此项时,eaccelerator会在每次请求时检查php文件的修改时间,看其是否被修改过,这会耗费一点时间,如果php文件被修改 过,eaccelerator会重新编译缓存该php文件。当关闭此项时,如果php文件被修改,则需要手工删除eaccelerator缓存,才能显示 被修改的php文件。"1"指打开,"0"指关闭。默认值为"1"。
  
  --------------------
  
  eaccelerator.debug="0"
  
  解释:打开或者关闭调试记录。当打开时,eaccelerator会将对一个缓存文件的每次请求都写进log。打开此项只对调试eaccelerator是否有BUG时有益处。"1"指打开,"0"指关闭。默认值为"0"。
  
  --------------------
  
  eaccelerator.filter=""
  
  解释:决定哪些PHP文件应该被缓存。可以指定一个范围(比如"*.php *.phtml"),这样被指定的文件就会被缓存。如果该范围以!开头,被指定的文件就不会被缓存。默认值为"",表示缓存所有的PHP文件。
  
  --------------------
  
  eaccelerator.shm_max="0"
  
  解释:一个用户使用例如eaccelerator_put之类的函数能够往共享内存中加载的最大数据。默认值为"0",表示不限制。(单位为字节)
  
  --------------------
  
  eaccelerator.shm_ttl="0"
  
  解释:当没有足够的空闲共享内存去尝试缓冲一个新脚本时,将删除至少在shm_ttl秒之前没有被访问过的文件。默认值为"0",表示不尝试从共享内存中删除任何旧的脚本。(单位为秒)
  
  --------------------
  
  eaccelerator.shm_prune_period="0"
  
  解释:当没有足够的空闲共享内存去尝试缓冲一个新脚本时,将删所有旧脚本,前提是这个尝试在超过shm_prune_period秒之前被执行过。默认值为"0",表示不尝试从共享内存中删除任何旧的脚本。(单位为秒)
  
  --------------------
  
  eaccelerator.shm_only="0"
  
  解释:打开或者关闭在磁盘上缓存编译过的脚本。这个参数对会话数据和内容缓存没有效果。默认值为"0",表示使用磁盘和共享内存来缓存。
  
  --------------------
  
  eaccelerator.compress="1"
  
  解释:打开或者关闭缓存内容压缩。"1"指打开,"0"指关闭。默认值为"1"。
  
  --------------------
  
  eaccelerator.compress_level="9"
  
  解释:内存压缩的级别。默认值为"9",表示最大压缩。

MySQL将null转代为0

1、如果为空返回0

select ifnull(null,0)
 

2、如果为空返回0,否则返回1
select if(isnull(col),0,1) as col.
MYSQL 中的IFNULL函数
IFNULL(expr1,expr2)
如果expr1不是NULL,IFNULL()返回expr1,否则它返回expr2。IFNULL()返回一个数字或字符串值,取决于它被使用的上下文环境。
mysql> select IFNULL(1,0);
-> 1
mysql> select IFNULL(0,10);
-> 0
mysql> select IFNULL(1/0,10);
-> 10
mysql> select IFNULL(1/0,'yes');
-> 'yes'

IF(expr1,expr2,expr3)
如果expr1是TRUE(expr1<>0且expr1<>NULL),那么IF()返回expr2,否则它返回expr3。IF()返回一个数字或字符串值,取决于它被使用的上下文。
mysql> select IF(1>2,2,3);
-> 3
mysql> select IF(1<2,'yes','no');
-> 'yes'
mysql> select IF(strcmp('test','test1'),'yes','no');
-> 'no'
expr1作为整数值被计算,它意味着如果你正在测试浮点或字符串值,你应该使用一个比较操作来做。
mysql> select IF(0.1,1,0);
-> 0
mysql> select IF(0.1<>0,1,0);
-> 1
在上面的第一种情况中,IF(0.1)返回0,因为0.1被变换到整数值, 导致测试IF(0)。这可能不是你期望的。在第二种情况中,比较测试原来的浮点值看它是否是非零,比较的结果被用作一个整数。
CASE value WHEN [compare-value] THEN result [WHEN [compare-value] THEN result ...] [ELSE result] END
 
CASE WHEN [condition] THEN result [WHEN [condition] THEN result ...] [ELSE result] END
第一个版本返回result,其中value=compare-value。第二个版本中如果第一个条件为真,返回result。如果没有匹配的result值,那么结果在ELSE后的result被返回。如果没有ELSE部分,那么NULL被返回。
mysql> SELECT CASE 1 WHEN 1 THEN "one" WHEN 2 THEN "two" ELSE "more" END;
-> "one"
mysql> SELECT CASE WHEN 1>0 THEN "true" ELSE "false" END;
-> "true"
mysql> SELECT CASE BINARY "B" when "a" then 1 when "b" then 2 END;

-> NULL
 

浅析MySQL数据碎片的产生

MySQL列表,包括MyISAM和InnoDB这两种最常见的类型,而根据经验来说,其碎片的产生及消除都是随机的。碎片会在你的表格中留下明显的空白,而这会给列表扫描工作带来相当大的困扰。对你的列表进行优化,这样会使列表的全面及分区扫描工作进行得更有效率。

碎片——实例

MySQL具有相当多不同种类的存储引擎来实现列表中的数据存储功能。 每当MySQL从你的列表中删除了一行内容,该段空间就会被留空。而在一段时间内的大量删除操作,会使这种留空的空间变得比存储列表内容所使用的空间更 大。当MySQL对数据进行扫描时,它扫描的对象实际是列表的容量需求上限,也就是数据被写入的区域中处于峰值位置的部分。如果进行新的插入操 作,MySQL将尝试利用这些留空的区域,但仍然无法将其彻底占用。

这种额外的破碎的存储空间在读取效率方面比正常占用的空间要低得多。让我们看一个实例。

我们将创建一个数据库(有时也称其为大纲)及一个测试用的列表:

  1. (root@localhost) [test]> create database frag_test;  
  2. Query OK, 1 row affected (0.03 sec)  
  3.  
  4. (root@localhost) [test]> use frag_test;  
  5. Database changed  
  6.  
  7. (root@localhost) [frag_test]> create table frag_test (c1 varchar(64));  
  8. Query OK, 0 rows affected (0.05 sec) 

现在让我们在列表中加入如下几行:

  1. (root@localhost) [frag_test]> insert into frag_test values ('this is row 1');  
  2. Query OK, 1 row affected (0.01 sec)  
  3.  
  4. (root@localhost) [frag_test]> insert into frag_test values ('this is row 2');  
  5. Query OK, 1 row affected (0.00 sec)  
  6.  
  7. (root@localhost) [frag_test]> insert into frag_test values ('this is row 3');  
  8. Query OK, 1 row affected (0.00 sec) 

现在我们进行碎片查看:

  1. (root@localhost) [frag_test]> show table status from frag_test\G;  
  2. *************************** 1. row ***************************  
  3.            Name: frag_test  
  4.          Engine: MyISAM  
  5.         Version: 10  
  6.      Row_format: Dynamic 
  7.            Rows: 3  
  8.  Avg_row_length: 20  
  9.     Data_length: 60  
  10. Max_data_length: 281474976710655  
  11.    Index_length: 1024  
  12.       Data_free: 0  
  13.  Auto_increment: NULL 
  14.     Create_time: 2011-02-23 14:55:27  
  15.     Update_time: 2011-02-23 15:06:55  
  16.      Check_time: NULL 
  17.       Collation: latin1_swedish_ci  
  18.        Checksum: NULL 
  19.  Create_options:   
  20.         Comment:   
  21. 1 row in set (0.00 sec)

现在我们删除一行,并再次检测:

  1. (root@localhost) [frag_test]> delete from frag_test where c1 = 'this is row 2';  
  2. Query OK, 1 row affected (0.00 sec)  
  3.  
  4. (root@localhost) [frag_test]> show table status from frag_test\G;  
  5. *************************** 1. row ***************************  
  6.            Name: frag_test  
  7.          Engine: MyISAM  
  8.         Version: 10  
  9.      Row_format: Dynamic 
  10.            Rows: 2  
  11.  Avg_row_length: 20  
  12.     Data_length: 60  
  13. Max_data_length: 281474976710655  
  14.    Index_length: 1024  
  15.       Data_free: 20  
  16.  Auto_increment: NULL 
  17.     Create_time: 2011-02-23 14:55:27  
  18.     Update_time: 2011-02-23 15:07:49  
  19.      Check_time: NULL 
  20.       Collation: latin1_swedish_ci  
  21.        Checksum: NULL 
  22.  Create_options:   
  23.         Comment:   
  24. 1 row in set (0.00 sec) 

需要注意的是,“data_free”一栏显示出了我们删除第二行后所产生的留空空间。想象一下如果你有两万行指令的话,结果是什么样的。以此推 算,它们将耗费四十万字节的存储空间。现在如果你将两万条命令行删到只剩一行,列表中有用的内容将只占二十字节,但MySQL在读取中会仍然将其视同于一 个容量为四十万字节的列表进行处理,并且除二十字节以外,其它空间都被白白浪费了。

清理碎片

幸运的是一旦你锁定了这一问题,MySQL提供了一种简便的修正方法。这就是所谓的优化列表,具体内容如下:

  1. (root@localhost) [frag_test]> optimize table frag_test;  
  2. +---------------------+----------+----------+----------+  
  3. | Table               | Op       | Msg_type | Msg_text |  
  4. +---------------------+----------+----------+----------+  
  5. | frag_test.frag_test | optimize | status   | OK       |   
  6. +---------------------+----------+----------+----------+  
  7. 1 row in set (0.00 sec)  
  8.  
  9. (root@localhost) [frag_test]> show table status from frag_test\G;  
  10. *************************** 1. row ***************************  
  11.            Name: frag_test  
  12.          Engine: MyISAM  
  13.         Version: 10  
  14.      Row_format: Dynamic 
  15.            Rows: 2  
  16.  Avg_row_length: 20  
  17.     Data_length: 40  
  18. Max_data_length: 281474976710655  
  19.    Index_length: 1024  
  20.       Data_free: 0  
  21.  Auto_increment: NULL 
  22.     Create_time: 2011-02-23 14:55:27  
  23.     Update_time: 2011-02-23 15:11:05  
  24.      Check_time: 2011-02-23 15:11:05  
  25.       Collation: latin1_swedish_ci  
  26.        Checksum: NULL 
  27.  Create_options:   
  28.         Comment:   
  29. 1 row in set (0.00 sec) 

性能考量

“优化列表”功能在进行中会对整个列表进行锁定。对于小型列表,这一功能的效果非常好,因为整个列表的读取和修改速度都会很快。但对于那些体积巨大的列表来说,这一过程将消耗很长时间,并且其间会中断或减少可用的应用程序数量。怎么办?

再一次,MySQL幸运地提供了一项堪称伟大的功能,名为“主-主复制”。 在这种配置之下,你的后台数据库实际上成为两个单独的数据库,一个主动可调用的,一个被动可调整的。这两个数据库在各方面来说都是完全相同的。要实现各种 在线操作——包括“优化列表”操作——只需在你的被动数据库中即可进行。这将不会对你的应用程序造成丝毫影响。一旦优化操作完成,主、被动数据库将互相转 换,以便应用程序直接指向二号数据库,对还未进行优化的主动数据库部分自动开始优化工作。

这时,两套数据库的角色已经互换,而应用程序也将顺利指向二号数据库,执行与在一号数据库上相同的列表优化。而现在主动已经转换为被动,因此不会中断主要任务处理。

其它命令

显示你数据库中存在碎片的全部列表:

  1. (root@localhost) [(none)]> select table_schema, table_name, data_free, engine from information_schema.tables where table_schema not in ('information_schema', 'mysql') and data_free > 0;  
  2. +--------------+-----------------------------+-----------+--------+  
  3. | table_schema | table_name                  | data_free | engine |  
  4. +--------------+-----------------------------+-----------+--------+  
  5. | aitc         | wp_comments                 |    346536 | MyISAM |   
  6. | aitc         | wp_options                  |     64308 | MyISAM |   
  7. | aitc         | wp_postmeta                 |       124 | MyISAM |   
  8. | cactidb      | poller_item                 |       160 | MyISAM |   
  9. | cactidb      | poller_output               |       384 | MyISAM |   
  10. | drupal       | sessions                    |     30976 | MyISAM |   
  11. | drupal       | users                       |        92 | MyISAM |   
  12. | drupal       | variable                    |        20 | MyISAM |   
  13. | gg           | wp_comments                 |       232 | MyISAM |   
  14. | gg           | wp_options                  |       696 | MyISAM |   
  15. | gg           | wp_postmeta                 |       560 | MyISAM |   
  16. | ihi          | wp_comments                 |       536 | MyISAM |   
  17. | ihi          | wp_options                  |       444 | MyISAM |   
  18. | ihi          | wp_postmeta                 |       288 | MyISAM |   
  19. | ihi          | wp_redirection_items        |      1292 | MyISAM |   
  20. | ihi          | wp_redirection_logs         |    140352 | MyISAM |   
  21. | nds          | wp_comments                 |      4704 | MyISAM |   
  22. | nds          | wp_options                  |    150580 | MyISAM |   
  23. | nds          | wp_postmeta                 |        76 | MyISAM |   
  24. | oos          | wp_comments                 |    317124 | MyISAM |   
  25. | oos          | wp_options                  |     88196 | MyISAM |   
  26. | oos          | wp_postmeta                 |        76 | MyISAM |   
  27. | phplist      | phplist_listuser            |       252 | MyISAM |   
  28. | phplist      | phplist_sendprocess         |        52 | MyISAM |   
  29. | phplist      | phplist_user_user           |     32248 | MyISAM |   
  30. | phplist      | phplist_user_user_attribute |       120 | MyISAM |   
  31. | phplist      | phplist_user_user_history   |       288 | MyISAM |   
  32. | phplist      | phplist_usermessage         |      1428 | MyISAM |   
  33. | pn_nds       | nuke_session_info           |     12916 | MyISAM |   
  34. | psa          | exp_event                   |     10024 | MyISAM |   
  35. | test         | active_sessions             |     30144 | MyISAM |   
  36. +--------------+-----------------------------+-----------+--------+  
  37. 31 rows in set (0.26 sec) 

如果你更改了某个列表的存储引擎,你也应该对这一列表进行碎片清理。这是因为MySQL的工作原理导致其必须读取整个列表,然后利用新的存储引擎将内容写回磁盘,而在此过程中碎片所在的位置及影响到的数据都对执行效率造成了严重的不良影响。

上述情况如下所示:

  1. (root@localhost) [frag_test]> alter table frag_test engine = innodb;  
  2. Query OK, 2 rows affected (0.17 sec)  
  3. Records: 2  Duplicates: 0  Warnings: 0  
  4.  
  5. (root@localhost) [frag_test]> show table status from frag_test  
  6.     -> \G;  
  7. *************************** 1. row ***************************  
  8.            Name: frag_test  
  9.          Engine: InnoDB  
  10.         Version: 10  
  11.      Row_format: Compact  
  12.            Rows: 2  
  13.  Avg_row_length: 8192  
  14.     Data_length: 16384  
  15. Max_data_length: 0  
  16.    Index_length: 0  
  17.       Data_free: 0  
  18.  Auto_increment: NULL 
  19.     Create_time: 2011-02-23 15:41:12  
  20.     Update_time: NULL 
  21.      Check_time: NULL 
  22.       Collation: latin1_swedish_ci  
  23.        Checksum: NULL 
  24.  Create_options:   
  25.         Comment: InnoDB free: 7168 kB  
  26. 1 row in set (0.00 sec) 

结论

如果你发现一些列表中包含了大量的数据留空现象,那么对其进行优化是绝对值得的,因为这一过程会大大提升列表的读取性能及应用表现。

开启Nginx的目录文件列表功能-让Nginx显示文件列表

打开nginx.conf文件,在location server 或 http段中加入
autoindex on;
另外两个参数最好也加上去:
autoindex_exact_size off;
默认为on,显示出文件的确切大小,单位是bytes。
改为off后,显示出文件的大概大小,单位是kB或者MB或者GB
autoindex_localtime on;
默认为off,显示的文件时间为GMT时间。
改为on后,显示的文件时间为文件的服务器时间

配置Nginx目录列表的方法详细参照:http://wiki.nginx.org/NginxChsHttpAutoindexModule

如果想希望目录列表支持header,footer则可以安装三方插件: http://wiki.nginx.org/NginxNgxFancyIndex

配置Nginx目录列表的效果如下:

Index of /

../
aspnet/                                            24-Jan-2010 21:45       -
mui/                                               03-Jun-2010 11:42       -
mysql/                                             24-Jan-2010 21:42       -
others/                                            23-Apr-2010 10:35       -
php/                                               24-Jan-2010 21:47       -
sql/                                               31-Mar-2010 15:14       -
zend/                                              16-Jan-2010 15:21       -
ctohome.com                                        09-Jan-2010 11:35     130
du.txt                                             25-Mar-2010 21:36      10
dumeter.zip                                        22-Jan-2010 12:05      2M
favicon.ico                                        26-Aug-2009 04:36     318
ftp.exe                                            05-Jan-2010 06:31      4M
index2.html                                        24-Jan-2010 21:53      24
lxadmin.tar.gz                                     04-Jan-2010 19:27    820K
servu.rar                                          08-Jan-2010 15:01     10M
servu6.rar                                         16-Jan-2010 12:17      5M
teamviewer.zip                                     15-Jan-2010 10:50      3M
winrar.exe                                         09-Dec-2009 14:23      1M