成千上万的SELECT语句在大型文本字段上进行LIKE搜索--如何提高性能


Thousands of SELECT statements w/ LIKE searches on large text fields -- how to improve performance?

我在wordpress中制作了一个插件,它会查看所有文件,看看该文件是否被使用。问题是,当我获取所有文件并对其中的每个文件进行查询时,会有很多查询。

例如,3000条sql语句如下:

SELECT COUNT(*) FROM " . $table_prefix . "posts  
WHERE post_content LIKE '%/$fileName%';

真正的问题是,如果进行大量的sql查询,服务器就会停机,所以问题是如何在不影响服务器的情况下查询3000个文件。

例如,我在一个目录中进行扫描,发现

a.jpg
b.jpg
c.jpg
d.jpg
……
……
z.jpg

所以知道它们中是否每一个的唯一方法是使用我之前写的查询,所以我会有一些类似的

 SELECT COUNT(*) FROM " . $table_prefix . "posts  
    WHERE post_content LIKE 'a.jpg';
SELECT COUNT(*) FROM " . $table_prefix . "posts  
    WHERE post_content LIKE 'b.jpg';
....
SELECT COUNT(*) FROM " . $table_prefix . "posts  
        WHERE post_content LIKE 'z.jpg';

我使用这个查询是因为我在搜索该文件是否在任何帖子中被引用,如果计数为0,则意味着该文件没有使用

因此,对于那些问问题是什么的人来说,是我如何毫无问题地进行所有查询,或者我如何更改查询以更好地搜索每个文件

您应该将对文件(1:1或1:N)的引用存储在另一个表中。然后您就不必使用"like"-语句,性能应该会更好。那么您也可以只使用一个sql语句来处理所有这些语句:

select count(*), file_id from ... group by file_id

如果你不想改变你的数据库模型,你可以试试这样的方法:

select count(*), files.filename from 
POSTS p left join ((select 'a.jpg' as filename) union (select 'b.jpg' as filename) union ...) files
on p.post_content CONCAT('%', files.filename, '%') collate utf8_general_ci
group by files.filename