2013-01-19 210 views
0

有此查詢已被竊聽我兩天了,它用來工作不錯,但現在它會減慢整個集羣環境中,查詢,如下圖所示:優化的接MySQL查詢

SELECT userUploads.*, 
     users_avatar.avatar AS avatar 
FROM userUploads 
     LEFT JOIN users_avatar 
      ON userUploads.udid = users_avatar.udid 
     INNER JOIN user_subscription 
      ON (
        user_subscription.sub_1 = 'G:123456789' 
        AND user_subscription.sub_2 = userUploads.udid 
       ) 
WHERE userUploads.platform = 'Private' 
     AND userUploads.STATUS IN ('featured', 'approved') 
ORDER BY userUploads.id DESC 
LIMIT 50 OFFSET 0 

我真的很感激,如果任何人都可以幫助這個查詢。

下面是查詢的解釋:提前

+----+-------------+-------------------+--------+----------------------+----------+---------+------------------------+------+-----------------------------+ 
| id | select_type | table    | type | possible_keys  | key  | key_len | ref     | rows | Extra      | 
+----+-------------+-------------------+--------+----------------------+----------+---------+------------------------+------+-----------------------------+ 
| 1 | SIMPLE  | userUploads  | range | platform,udid,status | platform | 154  | NULL     | 12 | Using where; Using filesort | 
| 1 | SIMPLE  | users_avatar  | eq_ref | PRIMARY    | PRIMARY | 182  | Seeds.userUploads.udid | 1 |        | 
| 1 | SIMPLE  | user_subscription | ref | sub_1,sub_2   | sub_1 | 93  | const     | 7 | Using where     | 
+----+-------------+-------------------+--------+----------------------+----------+---------+------------------------+------+-----------------------------+ 

感謝

編輯**顯示CREATE TABLE可以看到下面

下面是展會創建表的表希望你有任何想法dancrumb。

| users_avatar | CREATE TABLE `users_avatar` (
`udid` varchar(60) COLLATE utf8_unicode_ci NOT NULL DEFAULT '', 
`avatar` varchar(448) COLLATE utf8_unicode_ci DEFAULT NULL, 
PRIMARY KEY (`udid`) 
) ENGINE=ndbcluster DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci | 

| userUploads | CREATE TABLE `userUploads` (
`id` int(11) NOT NULL AUTO_INCREMENT, 
`bdaha` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL, 
`user` varchar(60) COLLATE utf8_unicode_ci DEFAULT NULL, 
`direktoren` text COLLATE utf8_unicode_ci, 
`filnamnet` varchar(180) COLLATE utf8_unicode_ci DEFAULT NULL, 
`karhes` varchar(150) COLLATE utf8_unicode_ci DEFAULT NULL, 
`version` char(10) COLLATE utf8_unicode_ci DEFAULT NULL, 
`rostat` int(10) DEFAULT NULL, 
`stars` int(11) DEFAULT NULL, 
`statyn` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL, 
`platform` char(30) COLLATE utf8_unicode_ci DEFAULT NULL, 
`images` int(2) DEFAULT NULL, 
`date` char(10) COLLATE utf8_unicode_ci DEFAULT NULL, 
`udid` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL, 
`favorirepris` int(8) DEFAULT NULL, 
`hikes` char(4) COLLATE utf8_unicode_ci DEFAULT 'no', 
`dbn` char(6) COLLATE utf8_unicode_ci DEFAULT NULL, 
`timestamp` char(20) COLLATE utf8_unicode_ci DEFAULT NULL, 
`comments` int(5) DEFAULT NULL, 
`klistret` enum('no','yes') COLLATE utf8_unicode_ci NOT NULL DEFAULT 'no', 
PRIMARY KEY (`id`), 
KEY `platform` (`platform`,`status`), 
KEY `udid` (`udid`), 
KEY `hikes` (`hikes`), 
KEY `bdaha` (`bdaha`), 
KEY `statyn` (`statyn`), 
KEY `version` (`version`) 
) ENGINE=ndbcluster AUTO_INCREMENT=118831 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci | 


| user_subscription | CREATE TABLE `user_subscription` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
`sub_1` varchar(30) COLLATE utf8_unicode_ci DEFAULT NULL, 
`sub_2` varchar(30) COLLATE utf8_unicode_ci DEFAULT NULL, 
PRIMARY KEY (`id`), 
KEY `sub_1` (`sub_1`), 
KEY `sub_2` (`sub_2`) 
) ENGINE=ndbcluster AUTO_INCREMENT=155184 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci | 
+1

您能爲這裏涉及的三張桌子提供'SHOW CREATE TABLE'嗎? – Dancrumb

+0

我不能回答我自己的問題,因爲我是新來的:(如何可以告訴你顯示創建表?它是要長時間粘貼在這裏... – Gimbo

+0

我在原始帖子中發佈了創建表:) – Gimbo

回答

0

那麼,你有一個userUploads文件總是緩慢。你可能想玩索引來刪除它。例如,您可能希望從udid,平臺和狀態的索引開始。

+0

Filesort不一定很慢。它只是意味着有一種不能使用索引的排序:** [在MySQL中使用filesort是什麼意思?](http://www.mysqlperformanceblog.com/2009/03/05/what-does-using -filesort-mean-in-mysql /)** –

+0

是的,你說得對,我當時馬虎。 –

+0

我該如何優化查詢?你有任何例子? – Gimbo

0

通常,在查詢要按照首先返回的數據執行最大限制操作時,只會對結果中實際存在的數據執行其他操作。

在這種情況下,嘗試將內部聯接重新排序爲user_subscription,將左側聯接重新排列到users_avatar。這樣,如果它們實際上位於結果集中,那麼它將只嘗試爲用戶獲取頭像,而不是先查找所有頭像,然後基於連接和where子句進行過濾。

SELECT userUploads.*, 
    users_avatar.avatar AS avatar 
FROM userUploads 
INNER JOIN user_subscription 
      ON (
        user_subscription.sub_1 = 'G:123456789' 
        AND user_subscription.sub_2 = userUploads.udid 
       ) 
LEFT JOIN users_avatar 
      ON userUploads.udid = users_avatar.udid 

WHERE userUploads.platform = 'Private' 
     AND userUploads.STATUS IN ('featured', 'approved') 
ORDER BY userUploads.id DESC 
LIMIT 50 OFFSET 0 
+0

該查詢將如何顯示? – Gimbo

+0

我沒有成功 – Gimbo