2013-01-19 2 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     | 
+----+-------------+-------------------+--------+----------------------+----------+---------+------------------------+------+-----------------------------+ 

감사 : 아래

는 쿼리의 설명이다 어떤 아이디어가 춤추고있다.

| 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

내가 여기에 새로운 질문인데 내 자신의 질문에 대답 할 수 없다 :(어떻게하면 SHOW CREATE TABLE을 보여줄 수 있습니까? 여기에 붙여 넣기가 오래 걸릴 것입니다 ... – Gimbo

+0

나는 원래 게시물에 테이블을 만듭니다. – Gimbo

답변

0

글쎄, userUploads에는 항상 느린 fileort가 있습니다. 그것을 제거하기 위해 색인을 가지고 놀고 싶을 수도 있습니다. 예를 들어 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