,이 쿼리를 개선하는 방법은 무엇입니까? 나는 테이블이
| PAGELETS | CREATE TABLE `PAGELETS` (
`page_key` int(32) unsigned NOT NULL,
`pagelet_serial` int(32) unsigned NOT NULL,
`pagelet_shingle` int(32) unsigned NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8
싶습니다하려면 다음에
SELECT * FROM PAGELETS WHERE pagelet_shingle IN(SELECT pagelet_shingle FROM PAGELETS GROUP BY pagelet_shingle HAVING COUNT(DISTINCT page_key) > 1) ORDER BY pagelet_shingle;
불행하게도,이는 반 정답을 생성하는 쿼리입니다
1) Find all the pagelet_shingles where quantity > 1 (occurs more than once)
2) out of these only output those that have different page_key
작은 데이터 세트는 약 18 초가 걸립니다. 내가 다른 쿼리가
,
SELECT dt1.* FROM
(SELECT * FROM PAGELETS
GROUP BY page_key, pagelet_shingle HAVING COUNT(*) = 1)
dt1 JOIN
(SELECT * FROM PAGELETS GROUP BY pagelet_shingle HAVING COUNT(*) > 1)
dt2 USING (pagelet_shingle) ORDER BY pagelet_shingle
기술적으로 정확하지 않은 전문가에 의해 주어진 (뭔가 .. GROUP SELECT * 수 없습니다 당신과 함께 할 수 있습니다)하지만 함께, 빠른 많이 있습니다 결과를 pagelet_shingle가 = 57
+----------+----------------+-----------------+
| page_key | pagelet_serial | pagelet_shingle |
+----------+----------------+-----------------+
| 1 | 99 | 57 |
| 1 | 99 | 57 |
| 2 | 228 | 57 |
| 2 | 228 | 57 |
+----------+----------------+-----------------+
은 세미 정확한 질의
,536 생산 PAGELETS FROM 경우SELECT * 그 결과 집합에서
+----------+----------------+-----------------+
| page_key | pagelet_serial | pagelet_shingle |
+----------+----------------+-----------------+
| 1 | 99 | 57 |
| 1 | 99 | 57 |
| 2 | 228 | 57 |
| 2 | 228 | 57 |
+----------+----------------+-----------------+
잘못된 쿼리 pagelet_shingle을 가지고 있지 않지만= 57
내 원하는 결과는
+----------+----------------+-----------------+
| page_key | pagelet_serial | pagelet_shingle |
+----------+----------------+-----------------+
| 1 | 99 | 57 |
| 2 | 228 | 57 |
+----------+----------------+-----------------+
각 한 번만 발생하는 것입니다.
동일한 pagelet_serial에서 두 번 발생하는 pagelet_shingle은 생략됩니다. 부정확 한 2의 속도에 도달하기 위해 csemi orrect 쿼리 속도를하는 방법이 있나요) 1) 나에 대한 잘못된 하나의 문제를 해결하는 방법은 무엇입니까 :
그래서 나는 다음과 같은 묻고 싶다 올바른 것의 결과를 내십시오 (나는 엄격함에 대해 신경 쓰지 않습니다)
모두가, 는 ORDER BY (pagelet_shingle HAVING COUNT (DISTINCT page_key)> 1 BY PAGELETS 그룹에서 선택 pagelet_shingle) PAGELETS WHERE pagelet_shingle IN * FROM DISTINCT SELECT하는 데 도움이 pagelet_shingle; 해결할 수 있지만 어떻게 더 빨리 만들 수 있습니까? –
mysql> EXPLAIN SELECT DISTINCT * pagelet_shingle IN (SELECT pagelet_shingle from pagelet_shingle from pagelet_shingle) pagelet_shingle HAVEING COUNT (DISTINCT page_key)> 1) ORDER BY pagelet_shingle; | 1 | PRIMARY | PAGELETS | 전체 | NULL | NULL | NULL | NULL | 6959 | 사용 장소; 임시 사용; filesort 사용 | | 2 | 부적절한 처분 | PAGELETS | 색인 | NULL | pagelet_shingle | 8 | NULL | 6959 | 인덱스 사용 | –
색인을 추가했습니다. | PAGELETS | 표'PAGELETS'를 CREATE ( 'page_key'의 INT (32) 부호 NULL NOT, 'pagelet_serial'의 INT (32) 부호 NULL NOT, 'pagelet_shingle'의 INT (32) 부호 NULL NOT, KEY'pagelet_shingle' ('pagelet_shingle ') ) ENGINE = MyISAM DEFAULT CHARSET = utf8 | SELECT DISTINCT * 여기에서 PAGELETS 위치 pagelet_shingle IN (SELECT pagelet_shingle PAGELETS GROUP BY pagelet_shingle HAVEING COUNT (DISTINCT page_key)) 1) ORDER BY pagelet_shingle; 은 여전히 지옥처럼 느립니다. –