SQL JOIN与LIKE(其中数据存储在行与另一个表中)

时间:2014-04-08 13:45:31

标签: php mysql sql join inner-join

我做过一些研究,但未能找到明确的答案。

在性能方面更好。

注意:只有10个可能的标签,最大长度为160个字符(如果选择了所有标签)。


一个表,包含3列:id,stuff,tags ... 其中tags列是varchar

并像这样查询:SELECT * FROM table WHERE tags LIKE %tagname%

或者

两个表:

  • tableA columns = id,stuff

  • tableB columns = id,tag

并像这样查询:SELECT * FROM tableA A INNER JOIN tableB B ON A.id = B.id WHERE B.tag = 'tagname'


插图 -

tableA中的行看起来像:123 |一些数据

tableB中的行看起来像:123 |标记名

我只是简单地询问如果没有很多标签,最好是在行中或在单独的表中存储标签。

3 个答案:

答案 0 :(得分:4)

  

在表现方面更好。

唐纳德·克努特(Donald Knuth)曾说过" 过早优化是所有邪恶的根源。"据了解,他表示通常不应该为性能而是为了正确性而构建一些东西,而只是进行优化以使应用程序在性能范围内要求。

您的性能要求是什么?有些人可能希望最小化内存利用率;其他人可能希望尽量减少CPU时间;其他人仍然可能意味着完全不同的表现"。

即使有人认为你的意思是"哪种操作最快",答案通常取决于各种因素,包括磁盘技术,存储引擎,索引设计,表格大小......

那么,你应该怎么做? 正常化直至疼痛;否则直到它起作用。

您的第一种方法违反了1NF。除非你有一些压倒一切的理由(你几乎不会这样做),否则不要这样做。

答案 1 :(得分:2)

肯定第二种选择更好。

您可以定义索引以便在完全扫描时更快地运行,您可以组合条件tag1 and (tag2 or tag3),您可以从标签中获取一些聚合数据?你可以按标签分组吗?找到具有相似标签组的类似实例。

答案 2 :(得分:1)

选择第二个选项。

第一种方法强制要求全表扫描(相当于检查表的每一条记录),而第二种方法中的结果集可以构建利用索引(假设索引是在主键上定义的[它们通常是自动]和tag列。)

实际的性能优势取决于数据库引擎的优化器。应该有一些命令或实用程序产生“解释计划”,这是对查询处理方式的总结。

内容可能是双重荷兰语,但您的数据库管理员应该知道如何生成以及如何阅读它。