2012-03-20 52 views
0

我在wordpress中制作一个插件,它查看所有文件以查看文件是否被使用。 问题是,当我得到所有文件并对它们中的每一个进行查询时,都会有很多查询。成千上万的SELECT语句在大型文本字段中使用LIKE搜索 - 如何提高性能?

例如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'; 

,我使用此查询,因为如果该文件是在任何岗位refered,如果计数为0,则表示该文件未使用

所以对于谁问什么是人我搜索问题是我如何使所有查询没有问题,或者我如何更改查询以更好地搜索每个文件

+0

如何对性能那个查询?它看起来可能是昂贵的... – 2012-03-20 15:13:43

+0

我明白你的想法,但具体是什么问题? – 2012-03-20 15:21:54

+0

看起来像要使用全文搜索: http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html – Daan 2012-03-20 15:22:58

回答

0

您应该在另一个表中存储对文件(1:1或1:N)的引用。那么你不必使用'like'陈述,而且表现应该更好。那么你也可以只用一个SQL-statment处理所有:

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 
+0

是的,你有rigth,但问题是我不会whant改变如何wordpress管理文件 – nicearma 2012-03-20 16:18:30

+0

我已经添加了一种方式,而无需更改数据库模型,但我不知道它有多快。 – user1027167 2012-03-20 19:27:30