我的数据库中有一个表,其中存储了服务器上某些文件的一些信息,例如“时间戳、所有者、关键字”。
现在我需要仅使用时间戳、或仅使用所有者、或仅使用关键字或这些字段的任意组合来搜索此表内的元素。
现在,关键字包含多个关键字(但搜索时只允许一个),我的研究应该尽可能快(表格将包含很多条目)。
现在使用 LIKE 子句更加高效
SELECT * FROM table WHERE keywords LIKE '%to_search%'
或者为每个关键字创建一个表并在其中存储数据(时间戳和所有者),并具有大量数据冗余?
最佳答案
在规范化的数据库设计中,您将拥有一个表,分别用于文件、关键字以及文件和关键字之间的关系。
因此,KEYWORDS 表看起来像(主键:keyword_id)
keyword_id keyword_desc
1 test
2 mysql
3 query
4 database
...FILES 表看起来像(主键:file_id)
file_id timestamp owner
1 2013-04-12 John
2 2013-01-01 Joseph
...FILES_KEYWORDS 表看起来像(主键:file_id、keyword_id)
file_id keyword_id
1 1
1 3
2 2
然后就可以查询包含关键字的文件,如下:
SELECT f.*
FROM files f
INNER JOIN
(
SELECT fk.file_id file_id
FROM files_keywords fk
INNER JOIN keywords k
ON fk.keyword_id = k.keyword_id AND k.keyword_desc = <search keyword>
) files_with_keywords
ON f.file_id = files_with_keywords.file_id;
替换<search keyword>
与您要执行搜索的关键字。
这样,索引将按预期使用,从而呈现最佳性能。
关于mysql:复制数据或 LIKE 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24627137/