2012-03-20 54 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