0

2日間で私を悩ませてきたこのクエリがあります。以前は正常に機能していましたが、現在はクラスター環境全体の速度が低下しています。クエリは次のようになります。

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

前もって感謝します

EDIT ** showcreatetableは以下に表示されます

以下は、テーブルのショー作成テーブルです。

| 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 |
4

2 に答える 2

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
于 2013-01-19T17:05:59.843 に答える
0

まあ、常に遅い userUploads にファイルソートがあります。それを削除するためにインデックスをいじることができます。たとえば、udid、プラットフォーム、およびステータスのインデックスから開始することができます。

于 2013-01-19T16:51:42.510 に答える