有什麼辦法如何優化一個查詢:能不能用數據[MySQL的]的大量更快執行
EXPLAIN EXTENDED SELECT keyword_id, ck.keyword, COUNT(article_id) AS cnt
FROM career_article_keyword
LEFT JOIN career_keywords ck
USING (keyword_id)
WHERE keyword_id
IN (
SELECT keyword_id
FROM career_article_keyword
LEFT JOIN career_keywords ck
USING (keyword_id)
WHERE article_id
IN (
SELECT article_id
FROM career_article_keyword
WHERE keyword_id =9
)
AND keyword_id <>9
)
GROUP BY keyword_id
ORDER BY cnt DESC
主要任務在這裏,如果我有特別的keyword_id(CURRENT_KID)我需要找到所有這是曾經與CURRENT_KID一起屬於任何物品,並且排序關鍵字結果基於使用量的這些關鍵字
表定義爲:的「解釋」
mysql> show create table career_article_keyword;
+------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| career_article_keyword | CREATE TABLE `career_article_keyword` (
`article_id` int(11) unsigned NOT NULL,
`keyword_id` int(11) NOT NULL,
UNIQUE KEY `article_id` (`article_id`,`keyword_id`),
CONSTRAINT `career_article_keyword_ibfk_1` FOREIGN KEY (`article_id`) REFERENCES `career` (`menu_id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> show create table career_keywords;
+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| career_keywords | CREATE TABLE `career_keywords` (
`keyword_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
`keyword` varchar(250) NOT NULL,
PRIMARY KEY (`keyword_id`)
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8 |
+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
輸出嚇死我了
大數據這個查詢可以殺死一切:)我可以使其更快不知何故?
謝謝。
不幸查詢resturn錯誤的數據:(您可以在這裏看看我的和你的版本http://o7.no/IFXd5m – user1016265 2012-04-25 07:16:58
@ user1016265:上面的修改版本現在應該是正確的了,你必須將自己的'career_article_keyword'表格加入自己三次(找到包含關鍵字,在這些文章中查找所有其他關鍵字,計算包含這些關鍵字的所有文章),所以如果該表變大,這肯定是一個問題;您是否嘗試過對您的查詢進行基準比較, ne(創建新的索引後,我建議)? – eggyal 2012-04-25 08:46:36
非常少量的數據感謝您的查詢需要0.0010秒。我的是:0.0028。通過添加SQL_NO_CACHE語句來調整兩個查詢。首先執行你的和二級礦井。當我添加建議索引時,更有趣的東西變成了。結果是:你的 - 0.0006,我的 - 0.0009。現在我需要了解這個與包括同一張桌子的三重魔法:)謝謝。 – user1016265 2012-04-25 13:32:06