소셜 네트워크 추적 응용 프로그램에서 작업 중입니다. 조인조차도 적절한 인덱싱으로 올바르게 작동합니다. 하지만 order by 절을 추가하면 총 쿼리 실행 시간이 100 배 길어집니다. order by 절없이 twitter_users를 가져 오는 데 사용한 다음 쿼리.mysql에서 조인을 사용하여 성능을 향상시키는 방법
SELECT DISTINCT `tracked_twitter`.id
FROM tracked_twitter
INNER JOIN `twitter_content` ON `tracked_twitter`.`id` = `twitter_content`.`tracked_twitter_id`
INNER JOIN `tracker_twitter_content` ON `twitter_content`.`id` = `tracker_twitter_content`.`twitter_content_id`
AND `tracker_twitter_content`.`tracker_id` = '88'
LIMIT 20
보기 행은 0-19
(20 총, 쿼리 0.0714 초를했다)하지만 (인덱스 컬럼) 조항에 의해
SELECT DISTINCT `tracked_twitter`.id
FROM tracked_twitter
INNER JOIN `twitter_content` ON `tracked_twitter`.`id` = `twitter_content`.`tracked_twitter_id`
INNER JOIN `tracker_twitter_content` ON `twitter_content`.`id` = `tracker_twitter_content`.`twitter_content_id`
AND `tracker_twitter_content`.`tracker_id` = '88'
ORDER BY tracked_twitter.followers_count DESC
LIMIT 20
보기 행을 순서를 추가 할 때 0-19 ((20) 총 쿼리 13.4636 초)
을 EXPLAIN했다 - : 19 (총 20은, 쿼리 0.0711 초를했다) 68,236,387 10,525,612 팔로어 -] 나는 그것이 0SELECT * FROM `tracked_twitter` WHERE 1 order by `followers_count` desc limit 20
보기 행 많은 시간을 고려하지 않습니다 만의 테이블에 ORDER BY 절을 구현
같은 테이블 작성 쿼리는 다음과
CREATE TABLE IF NOT EXISTS `tracked_twitter` (
`id` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`handle` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`location` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`description` text COLLATE utf8_unicode_ci,
`profile_image` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`followers_count` int(11) NOT NULL,
`is_influencer` tinyint(1) NOT NULL DEFAULT '0',
`created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`gender` enum('Male','Female','Other') COLLATE utf8_unicode_ci
DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `followers_count` (`followers_count`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
그래서 나는 그것의 테이블에 그것을 실행할 때 잘 작동하여 쿼리 및 주문을 느리게하지 않았다 가입 할 수 있습니다. 그렇다면 성능을 어떻게 향상시킬 수 있습니까? 나만 상위 테이블에서 결과 집합이 필요한 경우
UPDATE 1
@GordonLinoff 방법은 해결한다. 1 인당 숫자 트윗을 알고 싶습니다 (tracked_twitter 테이블과 일치하는 twitter_content 수). 어떻게 수정할 수 있습니까? 그리고 만약 내가 짹짹 콘텐츠에 수학 함수를 갖고 싶다면 어떻게해야합니까 ??
SELECT `tracked_twitter` . * , COUNT(*) AS twitterContentCount, retweet_count + favourite_count + reply_count AS engagement
FROM `tracked_twitter`
INNER JOIN `twitter_content` ON `tracked_twitter`.`id` = `twitter_content`.`tracked_twitter_id`
INNER JOIN `tracker_twitter_content` ON `twitter_content`.`id` = `tracker_twitter_content`.`twitter_content_id`
WHERE `is_influencer` != '1'
AND `tracker_twitter_content`.`tracker_id` = '88'
AND `tracked_twitter_id` != '0'
GROUP BY `tracked_twitter`.`id`
ORDER BY twitterContentCount DESC
LIMIT 20
OFFSET 0
'LIMIT' 절을 제거하면 정렬되지 않은 쿼리가 얼마나 오래 걸릴까요? 정렬되지 않은 결과 세트의 'LIMIT'은 기본적으로 "내 기준과 일치하는 20 개의 레코드를 가져옵니다"라는 의미입니다. 반면에 정렬 된 결과에서 "내 기준과 일치하는 처음 20 개의 레코드를 얻으십시오"라는 의미입니다. 기본적으로 모든 것을 식별해야 함을 의미합니다. 그들의. –
쿼리에서'EXPLAIN'의 결과는 무엇입니까? – raina77ow
@ raina77ow 문제의 설명 그림을 추가했습니다. – Tamizharasan