我有码表和其它表前缀。我需要匹配每个代码的(最长)前缀。MySQL的最佳实践:匹配前缀
还有其中我不得不限制前缀二次范围(这包括使其它表中)。我不认为这将此事在大多数情况下,但这里是一个简化(标准化)方案(我必须设置item.prefix_id):
group (id)
subgroup (id, group_id)
prefix (id, subgroup_id, prefix)
item (id, group_id, code, prefix_id)
它好吧缓存前缀的长度在一个新的领域和索引它。在前缀表中缓存group_id是好事(尽管组是相当小的表,在大多数情况下,我认为不会有性能提升)。 项目表包含几十万条记录,包含前缀最多500
编辑:
很抱歉,如果没有足够的定义的问题。当使用单词“前缀”时,我的意思是,所以代码必须以实际前缀开始。
subgroup
id group_id
-------------
1 1
2 1
3 1
4 2
prefix
id subgroup_id prefix
------------------------
1 1 a
2 2 abc
3 2 123
4 4 abcdef
item
id group_id code prefix_id
-----------------------------------
1 1 abc123 NULL
2 1 abcdef NULL
3 1 a123 NULL
4 2 abc123 NULL
为前缀列的预期结果是(item.id,item.prefix_id):
(1,2)由于:subroups 1,2,3是下组1,将码abc123
开始与前缀a
和前缀abc
和abc
是LOGEST两个的,所以我们采取的abc
这是2的ID,并把它变成item.prefix_id
。因为:即使前缀{4}(即abcdef
)是最匹配的前缀,它的子组(即4)在组2中,但该项在组1中,所以我们可以从子组1,2,3中选择,仍然是abc
是三个可能的前缀中的最低匹配。
(3,1)由于:a
是LOGEST匹配。
(4,NULL)因为:第4项是下组2和下组2的唯一前缀是abcdef
这是没有匹配到abc123
(因为abc123
不与abcdef
启动)。
但正如我所说的整个摸索事情是不是问题的重要组成部分。我主要关心的是有可能的前缀表匹配字符串表,以及如何做到这一点的最好方式。 (最佳含义是可读性,可维护性和性能之间的最佳平衡 - 因此是标题中的“最佳选择”)。
目前我正在做这样的事情:
UPDATE item USE INDEX (code3)
LEFT JOIN prefix ON prefix.length=3 AND LEFT(item.code,3)=prefix.prefix
LEFT JOIN subgroup ON subgroup.id=prefix.subgroup_id
WHERE subgroup.group_id == item.group_id AND
item.segment_id IS NULL
凡code3
是KEY code3 (segment_id, group_id, code(3))
。 - 同样的逻辑重复1,2,3和4作为长度。这看起来很有效,但我不喜欢它中存在重复(4个查询单个操作)。 - 当然这是在当前缀的最大legth是4
感谢大家分享你的想法这么远。
到目前为止您尝试了哪些查询? –
你用两个相同长度的前缀做什么? –
@vbence'code'列的类型是什么?如果varchar,那么varchar的长度是多少?和前缀相同的问题。 – Karolis