分享、学习、提高
2009/09/23 10:38
文章作者:Enjoy 转载请注明原文链接。
一个新闻表news,有zone_id字段记录地区ID,pubtime记录发布时间。
最常见的操作是列出某地区按发布时间排序的前几条。
原来的zone_id是char(6) GBK,地区ID都是固定6位的,加了和pubtime的联合索引,实现省的获取时也可以利用到索引,比如like '35%'。
用数字的话like '35%'就用不上索引了。
后来想到,如果用数字的话,可以使用zone_id >= 350000 AND zone_id < 360000来使用索引。

数字索引的效率肯定比字符的高,但具体高多少,还是要测试一下才知道。

增加一个zone_id2字段,
ALTER TABLE `news` ADD `zone_id3` INT UNSIGNED NOT NULL DEFAULT '0';
加索引
ALTER TABLE `news` ADD INDEX y( zone_id2, pubtime )

现在news库里有近9w条记录。

查询厦门的最新发布的10条新闻,350200是厦门的地区号。
SELECT * FROM news WHERE zone_id = '350200' ORDER BY pubtime DESC LIMIT 10
执行时间:0.0007
id  select_type  table  type  possible_keys  key  key_len  ref  rows  Extra  
1 SIMPLE news ref x x 12 const 3 Using where

SELECT * FROM news WHERE zone_id2 = 350200 ORDER BY pubtime DESC LIMIT 10
执行时间:0.0006
id  select_type  table  type  possible_keys  key  key_len  ref  rows  Extra  
1 SIMPLE news ref y y 4 const 3 Using where

查询福建的最新发布的10条新闻,福建省下的城市都是以35开头的。
SELECT * FROM news WHERE zone_id like '35%' ORDER BY pubtime DESC LIMIT 10
执行时间:0.1298
id  select_type  table  type  possible_keys  key  key_len  ref  rows  Extra  
1 SIMPLE news range x x 12 NULL 15630 Using where; Using filesort

SELECT * FROM news WHERE zone_id2 >= 350000 AND zone_id2 < 360000 ORDER BY pubtime DESC LIMIT 10
执行时间:0.1175
id  select_type  table  type  possible_keys  key  key_len  ref  rows  Extra  
1 SIMPLE news range y y 4 NULL 16205 Using where; Using filesort

char(6) GBK要占12个字节,int占4个,差别应该就在这里吧。
发表评论
表情
emotemotemotemotemot
打开HTML
打开UBB
打开表情
隐藏
昵称   密码   游客无需密码
网址   电邮   [注册]
               

验证码 不区分大小写