不定选项的储存方式
星期六, 7月 19th, 2008Web应用中常常会遇到同一属性的多选项目。例如:快餐店每日会提供不同的菜式选择,但有可能存在某些菜式会在菜单中重复出现。这时我们在添加菜式的时候会让客户选择该菜式在一周间那些日子才可提供选择。这种选项一般不会太多,但很可能会经常作为查询条件。常见手段如下:
一、建立七个标识字段……,这种做法理论上查询速度是最快的,但需要额外多建立N个字段和索引,空间开销不小。
二、Char字段按特定格式储存,形如:,1,2,3,4, ……。这种做法是比较常见的,但查询时候设计字符字段的模糊查询,效率恐怕不高。
如果把模糊搜索的操作换成数学运算效率应该会有所提高。问题是如何把数字作唯一标识,而且在多选的情况下具备唯一可分解性。复习一下小学的功课,这个世界上存在一种数,他们大于1,并且只能被1和自己整除——素数。利用素数的性质,使用整型作储存选择结果的字段,是否会带来性能上的提高,初步做个实验验证一下。实验平台:Fedora 8、mysql 5.22。
例一,表结构和储存格式:
create table test1(
pk int(8) auto_increment primary key,
content varchar(200),
testkey varchar(15),
index(testkey))Engine=MYISAM default charset=utf8
$weekday=array(1,2,3,4,5,6,7)
insert into test1 (content,testkey) values (’此处略一百字’,',$weekday[N],$weekday[M],….’)
例二,表结构和储存格式:
create table test2(
pk int(8) auto_increment primary key,
content varchar(200),
testkey int(6),
index(testkey))Engine=MYISAM default charset=utf8
$weekday=array(2,3,5,7,11,13,17)
insert into test2 (content,testkey) values (’此处再略一百字’,$weekday[N]*$weekday[M]*….)
两表分别灌入十万条数据(选项结果相同),下面用命令行和Web方式执行查询计算程序执行时间(各十次取平均数)。
一、选出周一菜式:
1: select pk,content from test1 where testkey like ‘%,1,%’
78000条查询结果,平均耗时0.13s;Web未测试
2: select pk,content from test2 where MOD(testkey,2)=0
78000条查询结果,平均耗时0.07s;Web未测试
二、选出一,三,五菜式:
1: select pk,content from test1 where testkey like ‘%,1,%’ and testkey like ‘%,3,%’ and testkey like ‘%,5,%’ and limit 0,15
Web页(PHP 5.2)平均执行时间:0.0074s
2: select pk,content from test2 where MOD(testkey,2)=0 and MOD(testkey,5)=0 and MOD(testkey,11)=0 limit 0,15
Web页平均执行时间:0.0026s
实验结论:相对于使用字符型字段模糊查询,整型取模的方式在十万数据量下的查询性能有明显提高。