我需要将无限属性附加到表中的记录,并且我已经使用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'

最佳答案

我会使用内部联接。这将提供较小的结果集和所需的结果集。

您是否尝试过此查询?

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进行扫描。如果您有正确的索引,这些将很快。

关于sql - 在mysql中设计动态键值对的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2170951/

10-14 13:48
查看更多