如您所见,您的搜索策略很慢。很慢,因为
LIKE '%something%'
必须扫描表以查找匹配项。 LIKE 搜索中的前导 % 符号是破坏性能的绝佳方式。
我不知道您的path 表中有多少列。如果有很多列,您可以做两件快速的事情来提高性能:
- 去掉
SELECT * 并在结果集中列出您想要的列的名称。
- 创建一个复合索引,其中包含您的
filename 列和您需要检索的其他列。
(如果您的表中只有几列,这将无济于事。)
您不能使用直接出的软件包FULLTEXT 搜索这些东西,因为它是为语言文本设计的。
如果我必须让这项工作快速投入生产,我会这样做:
首先,创建一个名为“searchterm”的新表,其中包含
filename_id INT the id number of a row in your path table
searchterm VARCHAR(20) a fragment of a filename.
其次,编写一个读取filename_id 和filename 值的程序,并为每个值插入一堆不同的行到searchterm。对于您显示的项目,值应该是:
LG_MARGINCALL_HD2CH_127879834_EN.mov (original)
LG MARGINCALL HD2CH 127879834 EN mov (split on punctuation)
HD 2 CH (split on embedded numerics)
MARGIN CALL (split on an app-specific list of words)
因此,您的搜索词表中有一堆条目,它们都具有相同的 filename_id 值和许多不同的小块文本。
最后,在搜索时你可以这样做。
SELECT path.id, path.filename, path.whatever,
COUNT(DISTINCT searchterms.term) AS termcount
FROM path
JOIN searchterm ON path.filenanme_id = search.filename_id
WHERE searchterm.term IN ('margin','call','hd','en', 'mov')
GROUP BY path.id, path.filename, path.whatever
ORDER BY path.filename, COUNT(DISTINCT searchterms.term) DESC
这个小查询会找到与您要搜索的内容匹配的所有片段。它返回多个文件名,并按照匹配最多术语的顺序显示它们。
我的建议是您创建自己的特定于应用程序的有点像全文搜索系统。如果你真的有几百万个多媒体文件,这肯定是值得你努力的。