mysql:复制数据或 LIKE 子句

标签 mysql sql performance

我的数据库中有一个表,其中存储了服务器上某些文件的一些信息,例如“时间戳、所有者、关键字”。

现在我需要仅使用时间戳、或仅使用所有者、或仅使用关键字或这些字段的任意组合来搜索此表内的元素。

现在,关键字包含多个关键字(但搜索时只允许一个),我的研究应该尽可能快(表格将包含很多条目)。

现在使用 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/

相关文章:

Mysql:选择两个日期之间的所有数据

mysql - 来自数据库的计数与增量

php - pdo 定义一个函数,然后在 select 语句中使用它

mysql - 根据事件时间长度显示表中的记录数?

mysql - 色谱柱的最佳用途是什么?

sql - 将图像插入 BLOB Oracle 10g

javascript - 使用 XHR 和脚本 src 的区别

performance - grails 2/groovy 2/JDK7 : how to reap the benefits?

mysql - MySQL/PostgreSQL 中 IN 关键字的速度

php - 如何从 mysql 数据库中的序列化字段进行搜索?