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

JavaScript验证URL地址的正则

[ 2009-12-02 12:33 by plhwin | 分类:前端开发 | 访问:5,331次 | 1条评论 | 查看评论 发表评论 ]

js验证URL经常会在项目中用到,突然看到一个比较全面的验证函数,验证的情况包括IP,域名(domain),ftp,二级域名,域名中的文件,域名加上端口,FTP用户名等等信息,虽然还没来得及做测试,但是先收藏了。感谢原作者,虽然我并不知道原作者到底是谁。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function IsURL(str_url){
	var strRegex = "^((https|http|ftp|rtsp|mms)?://)"
	+ "?(([0-9a-z_!~*'().&=+$%-]+: )?[0-9a-z_!~*'().&=+$%-]+@)?" //ftp的user@
	+ "(([0-9]{1,3}\.){3}[0-9]{1,3}" // IP形式的URL- 199.194.52.184
	+ "|" // 允许IP和DOMAIN(域名)
	+ "([0-9a-z_!~*'()-]+\.)*" // 域名- www.
	+ "([0-9a-z][0-9a-z-]{0,61})?[0-9a-z]\." // 二级域名
	+ "[a-z]{2,6})" // first level domain- .com or .museum
	+ "(:[0-9]{1,4})?" // 端口- :80
	+ "((/?)|" // a slash isn't required if there is no file name
	+ "(/[0-9a-z_!~*'().;?:@&=+$,%#-]+)+/?)$";
	var re=new RegExp(strRegex);
	//re.test()
	if (re.test(str_url)){
		return true;
	}else{
		return false;
	}
}

修正wordpress的All in One SEO Pack插件无法自动截取文章作为META description的BUG

[ 2009-12-01 14:25 by plhwin | 分类:php,开源 | 访问:3,495次 | 7条评论 | 查看评论 发表评论 ]

我的博客使用了最新的 All in One SEO Pack 1.6.8.1 作为SEO插件,个人感觉这款插件还是很不错的,特别是google,我几乎上午发布一篇文章,下午或者第二天就被收录了。但是我也发现了文章页面一个问题,就是每篇文章都没有通过截取文章前若干文字而产生meta 的 description标签,这对搜索引擎还是比较重要的。可是我明明在后台的“All in One SEO”设置里勾选了“Autogenerate Descriptions”这一项,既然选择了自动添加描述,可是为什么没有“自动”呢?带着这个问题,我查看了这款插件的源代码,进行了一部分修改,解决了这个问题。

Pages: Prev 1 2 3 4 5 6 Next