我需要将无限属性附加到表中的记录中,并且我已经使用mysql设计了一个使用#3的系统。不幸的是,我发现搜索超过一百万条记录变得越来越慢。 #2是更好的方法,还是有更好的方法?这是使用视图的情况吗?我想把我的密钥表分开,所以我知道为每条记录存储了什么属性。
1:简单:
table records: id, recordname, valname
select recordname from records where valname = 'myvalue'
2:稍微复杂一点:
table records: id recordname
table keyvalues: id recordid keyname valname
select r.recordname
from records r
right join keyvalues kv on kv.recordid = r.id
and kv.keyname='mykey'
and kv.valname = 'myvalue'
3:最复杂:
table records: id recordname
table keys: id keyname
table values: id recordid keyid valname
select r.recordname
from records r
right join keys k on k.keyname='mykey'
right join values v on v.recordid = r.id
and v.keyid = k.id
and v.valname = 'myvalue'
答案 0 :(得分:2)
我会使用内部联接。这将给出一个较小的结果集和您想要的结果集。
您是否尝试过此查询?
select r.recordname
from records r
left join values link on link.recordid = r.id and link.valname = 'myvalue'
left join keys k on r.keyid = link.key.id and k.keyname = 'mykey'
但是,我认为真正的方法是拥有4个表
table records: id recordname
table keys: id keyname
table values : id valuename
table joins : id recordid keyid valueid
然后(使用正确的索引)你可以有这样的查询
select r.recordname
from joins j
left join records r on j.recordid = r.id
left join keys k on j.keyid = k.id
left join values v on j.valueid = v.id
where v.valuename = 'myvalue' and k.keyname = 'mykey'
这应该非常快......它所要做的就是在值和键中找到id,然后在j上进行扫描。如果你有正确的索引,这些将很快。