标签类目:mysql

在centos 5.3上安装nginx0.7.67+mysql5.1.49+php5.2.14

[ 2010-07-30 11:23 by plhwin | 分类:web服务器 | 访问:3,813次 | 5条评论 | 查看评论 发表评论 ]

Nginx (“engine x”) 是一个高性能的 HTTP 和反向代理服务器,由于它的高性能和稳定性,国内越来越多的网站已经开始使用 Nginx 作为 Web 服务器。以下是笔者最近一次的的安装配置笔记。

系统版本:CentOS release 5.3 (Final),安装之前,先确定服务器是否可以连通网络,否则wget、yum等网络命令均无法使用。

编辑/etc/resolv.conf

vim /etc/resolv.conf

在尾部加入下面的内容(*处填写你的DNS地址),重启就好了。

nameserver ***.***.*.**
nameserver ***.***.*.**

例如北京地区的DNS为:202.106.0.20 和 211.161.46.84

以下是服务器安装的各个软件的安装版本:

nginx-0.7.67:nginx最新稳定版本
mysql-5.1.49:MySQL 5.1系列最新版本
php-5.2.14:PHP5.2系列最新版本
php-5.2.14-fpm-0.5.14:以FastCGI模式编译安装PHP5.2.14时需要用到的补丁
libiconv-1.13:编译安装PHP 5.2.14所需的支持库
libmcrypt-2.5.8:编译安装PHP 5.2.14所需的支持库
mcrypt-2.6.8:编译安装PHP 5.2.14所需的支持库
memcache-2.2.5:高性能的分布式内存缓存服务器
mhash-0.9.9.9:编译安装PHP 5.2.14所需的支持库
pcre-8.01:安装Nginx所需的pcre库
eaccelerator-0.9.6:eAccelerator可以加速PHP
PDO_MYSQL-1.0.2:mysql pdo支持
ImageMagick:ImageMagick库
imagick-2.3.0:imagick库

以上版本均为截止2010.7.30日的官方最新稳定版本,可用在ssh中直接使用wget命令从官网获得:

MySQL DISTINCT 的基本实现原理

[ 2009-12-13 05:18 by plhwin | 分类:数据库 | 访问:3,352次 | 查看评论 发表评论 ]

DISTINCT 实际上和 GROUP BY 操作的实现非常相似,只不过是在 GROUP BY 之后的每组中只取出一条记录而已。所以,DISTINCT 的实现和 GROUP BY 的实现也基本差不多,没有太大的区别。同样可以通过松散索引扫描或者是紧凑索引扫描来实现,当然,在无法仅仅使用索引即能完成 DISTINCT 的时候,MySQL 只能通过临时表来完成。但是,和 GROUP BY 有一点差别的是,DISTINCT 并不需要进行排序。也就是说,在仅仅只是 DISTINCT 操作的 Query 如果无法仅仅利用索引完成操作的时候,MySQL 会利用临时表来做一次数据的“缓存”,但是不会对临时表中的数据进行 filesort 操作。当然,如果我们在进行 DISTINCT 的时候还使用了 GROUP BY 并进行了分组,并使用了类似于 MAX 之类的聚合函数操作,就无法避免 filesort 了。

下面我们就通过几个简单的 Query 示例来展示一下 DISTINCT 的实现。

1.首先看看通过松散索引扫描完成 DISTINCT 的操作:

sky@localhost : example 11:03:41> EXPLAIN SELECT DISTINCT group_id 
    -> FROM group_messageG
*************************** 1. row ***************************
           id: 1
  SELECT_type: SIMPLE
        table: group_message
         type: range
possible_keys: NULL
          key: idx_gid_uid_gc
      key_len: 4
          ref: NULL
         rows: 10
        Extra: Using index for group-by
1 row in set (0.00 sec)

MySQL 中 GROUP BY 基本实现原理

[ 2009-12-09 01:02 by plhwin | 分类:数据库 | 访问:2,626次 | 查看评论 发表评论 ]

由于 GROUP BY 实际上也同样会进行排序操作,而且与 ORDER BY 相比,GROUP BY 主要只是多了排序之后的分组操作。当然,如果在分组的时候还使用了其他的一些聚合函数,那么还需要一些聚合函数的计算。所以,在GROUP BY 的实现过程中,与 ORDER BY 一样也可以利用到索引。

在 MySQL 中,GROUP BY 的实现同样有多种(三种)方式,其中有两种方式会利用现有的索引信息来完成 GROUP BY,另外一种为完全无法使用索引的场景下使用。下面我们分别针对这三种实现方式做一个分析。

1.使用松散(Loose)索引扫描实现 GROUP BY

何谓松散索引扫描实现 GROUP BY 呢?实际上就是当 MySQL 完全利用索引扫描来实现 GROUP BY 的时候,并不需要扫描所有满足条件的索引键即可完成操作得出结果。

下面我们通过一个示例来描述松散索引扫描实现 GROUP BY,在示例之前我们需要首先调整一下 group_message 表的索引,将 gmt_create 字段添加到 group_id 和 user_id 字段的索引中:

sky@localhost : example 08:49:45> create index idx_gid_uid_gc 
    -> on group_message(group_id,user_id,gmt_create);
Query OK,  rows affected (0.03 sec)
Records: 96  Duplicates: 0  Warnings: 0
 
sky@localhost : example 09:07:30> drop index idx_group_message_gid_uid 
    -> on group_message;
Query OK, 96 rows affected (0.02 sec)
Records: 96  Duplicates: 0  Warnings: 0

MySQL 中 Join 的基本实现原理

[ 2009-12-07 02:50 by plhwin | 分类:数据库 | 访问:2,078次 | 查看评论 发表评论 ]

在 MySQL 中,只有一种 Join 算法,就是大名鼎鼎的 Nested Loop Join,他没有其他很多数据库所提供的 Hash Join,也没有 Sort Merge Join。顾名思义,Nested Loop Join 实际上就是通过驱动表的结果集作为循环基础数据,然后一条一条的通过该结果集中的数据作为过滤条件到下一个表中查询数据,然后合并结果。如果还有第三个参与 Join,则再通过前两个表的 Join 结果集作为循环基础数据,再一次通过循环查询条件到第三个表中查询数据,如此往复。

还是通过示例和图解来说明吧,后面将通过我个人数据库测试环境中的一个 example(自行设计,非MySQL 自己提供) 数据库中的三个表的 Join 查询来进行示例。

注意:由于这里有些内容需要在MySQL 5.1.18之后的版本中才会体现出来,所以本测试的MySQL 版本为5.1.26

MySQL ORDER BY 的实现分析

[ 2009-12-05 04:10 by plhwin | 分类:数据库 | 访问:2,494次 | 查看评论 发表评论 ]

总的来说,在 MySQL 中的ORDER BY有两种排序实现方式,一种是利用有序索引获取有序数据,另一种则是通过相应的排序算法,将取得的数据在内存中进行排序。

下面将通过实例分析两种排序实现方式及实现图解:
假设有 Table A 和 B 两个表结构分别如下:

sky@localhost : example 01:48:21> show create table AG
*************************** 1. row ***************************
Table: A
Create Table: CREATE TABLE `A` (
`c1` int(11) NOT NULL default '0',
`c2` char(2) default NULL,
`c3` varchar(16) default NULL,
`c4` datetime default NULL,
PRIMARY KEY  (`c1`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
 
sky@localhost : example 01:48:32> show create table BG
*************************** 1. row ***************************
Table: B
Create Table: CREATE TABLE `B` (
`c1` int(11) NOT NULL default '0',
`c2` char(2) default NULL,
`c3` varchar(16) default NULL,
PRIMARY KEY  (`c1`),
KEY `B_c2_ind` (`c2`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8