2009/09/23 10:38
文章作者:Enjoy 转载请注明原文链接。
最常见的操作是列出某地区按发布时间排序的前几条。
原来的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个,差别应该就在这里吧。

针对某些域名显示无法打开页面
FROM中有名称为action的input会和action冲突的解决

