我的查詢很慢。我在3個表格之間搜索。 Se_movies = 80000條記錄,se_movie_contenttags = 1.6 mil記錄,se_movie_description標籤-200000條記錄我的SQL查詢非常慢(60秒),任何人有想法改進?
兩個簡化查詢。
OR - 慢
SELECT SQL_NO_CACHE count(movie_id)
FROM se_movies LEFT JOIN se_users ON se_movies.movie_user_id=se_users.user_id
LEFT JOIN
(
SELECT did , cid , ifnull(cid,did) as uid FROM (SELECT tag_object_id AS did FROM se_movie_descriptiontags WHERE tag_name IN ('dog')) AS dtag
LEFT JOIN (SELECT tag_object_id AS cid FROM se_movie_contenttags WHERE tag_name IN ('dog')) AS ctag
ON dtag.did=ctag.cid
UNION
SELECT did , cid , ifnull(cid,did) as uid FROM (SELECT tag_object_id AS did FROM se_movie_descriptiontags WHERE tag_name IN ('dog')) AS dtag
RIGHT JOIN (SELECT tag_object_id AS cid FROM se_movie_contenttags WHERE tag_name IN ('dog')) AS ctag
ON dtag.did=ctag.cid
)
AS tagobjects ON se_movies.movie_id=tagobjects.uid
WHERE (se_movies.movie_title LIKE '%dog%') **OR** ( (cid IS NOT NULL or did IS NOT NULL) and uid IS NOT NULL)
AND - 快速
SELECT SQL_NO_CACHE count(movie_id)
FROM se_movies LEFT JOIN se_users ON se_movies.movie_user_id=se_users.user_id
LEFT JOIN
(
SELECT did , cid , ifnull(cid,did) as uid FROM (SELECT tag_object_id AS did FROM se_movie_descriptiontags WHERE tag_name IN ('dog')) AS dtag
LEFT JOIN (SELECT tag_object_id AS cid FROM se_movie_contenttags WHERE tag_name IN ('dog')) AS ctag
ON dtag.did=ctag.cid
UNION
SELECT did , cid , ifnull(cid,did) as uid FROM (SELECT tag_object_id AS did FROM se_movie_descriptiontags WHERE tag_name IN ('dog')) AS dtag
RIGHT JOIN (SELECT tag_object_id AS cid FROM se_movie_contenttags WHERE tag_name IN ('dog')) AS ctag
ON dtag.did=ctag.cid
)
AS tagobjects ON se_movies.movie_id=tagobjects.uid
WHERE (se_movies.movie_title LIKE '%dog%') **AND** ( (cid IS NOT NULL or did IS NOT NULL) and uid IS NOT NULL)
每一個單獨
(se_movies.movie_title LIKE '%dog%') - around 300
(cid IS NOT NULL or did IS NOT NULL) and uid IS NOT NULL - return 595
,但它是快,如果任何人他們返回大約50或更少。
基本上如果任何關鍵字具有在上述各標籤和電影表標題500 ...它需要60秒
否則2.3秒。
有沒有更好的方法?
我知道u能這兩個... 之間和其他的東西做UNION ...
搜索 - 冠軍OR(或CONTENTTAG desctag)
問題是查詢的太多變化...
是否問題在做或者如果數據在兩個不同的表中?無論如何加快它們?
謝謝。
系統 - mysql apache2 php5 ubuntu - 亞馬遜aws。
解釋 enter link description here
解決它BY
SELECT SQL_NO_CACHE計數(movie_id) FROM se_movies LEFT JOIN se_users ON se_movies.movie_user_id = se_users.user_id INNER JOIN (SELECT tag_object_id AS movieid FROM se_movie_contenttags WHERE tag_name IN('dog') UNION SELECT tag_object_id AS movieid FROM se_movie_descriptiontags WHERE tag_name IN('dog') UNION SELECT s1.movie_id AS movieid FROM se_movies爲S1 WHERE s1.movie_title LIKE '%狗%' UNION SELECT s2.movie_id AS movieid FROM se_movies爲S2 WHERE s2.movie_desc LIKE '%狗%' ) AS tagobjects ON se_movies.movie_id = tagobjects.movieid
。5秒
請讓我們知道您的表上有哪些索引 - 並將EXPLAIN SELECT ...的輸出附加到您的問題。 – 2011-05-19 22:27:40
是否故意在慢查詢中的OR子句之後的術語沒有與其他子句括起來?您目前實際上有(A和B和C和D)或E,即 - 如果OR子句的RHS爲真,則AND並不重要。 – 2011-05-19 22:36:46