У меня есть таблица,Как улучшить этот запрос?
| 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
Я хотел бы:
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
Это запрос, который производит полу-правильный ответ:
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;
К сожалению, на небольшой набор данных занимает около 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
дается экспертом, который не является технически правильным (что-то делать с вами не SELECT * .. GROUP), но дает результаты, намного быстрее, с случай, когда
SELECT * FROM PAGELETS WHERE pagelet_shingle = 57
+----------+----------------+-----------------+
| page_key | pagelet_serial | pagelet_shingle |
+----------+----------------+-----------------+
| 1 | 99 | 57 |
| 1 | 99 | 57 |
| 2 | 228 | 57 |
| 2 | 228 | 57 |
+----------+----------------+-----------------+
Полупроницаемая правильный запрос выдает
+----------+----------------+-----------------+
| 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 |
+----------+----------------+-----------------+
Каждый встречающийся только один раз.
a pagelet_shingle, происходящий дважды в том же pagelet_serial, будет опущен.
Так что я хотел бы спросить следующее: 1) Есть ли способ ускорить csemi запроса дого правильный, чтобы достичь скорости некорректного одного 2) или есть способ исправить неправильные один к (я не забочусь о строгости)
Все, SELECT DISTINCT * 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; Решает, но как мне сделать это быстрее сейчас? – 2009-09-01 11:10:13
mysql> EXPLAIN SELECT DISTINCT * FROM PAGELETS WHERE pagelet_shingle IN (SELECT pagelet_shingle FROM PAGELETS GROUP BY page__Single_HINGING COUNT (DISTINCT page_key)> 1) ORDER BY pagelet_shingle; | 1 | ПЕРВИЧНЫЙ | PAGELETS | ВСЕ | NULL | NULL | NULL | NULL | 6959 | Использование где; Использование временных; Использование filesort | | 2 | ЗАВИСИМОЕ СУБКЕРУ | PAGELETS | индекс | NULL | pagelet_shingle | 8 | NULL | 6959 | Использование индекса | – 2009-09-01 11:11:55
Я добавил индекс, | PAGELETS | CREATE TABLE 'PAGELETS' ( ' page_key' INT (32) NOT NULL без знака, 'pagelet_serial' INT (32) NOT NULL без знака, ' pagelet_shingle' INT (32) NOT NULL без знака, KEY 'pagelet_shingle' (' pagelet_shingle ') ) ENGINE = MyISAM DEFAULT CHARSET = utf8 | SELECT DISTINCT * FROM PAGELETS WHERE pagelet_shingle IN (SELECT pagelet_shingle FROM PAGELETS GROUP BY page__Single_HINGING COUNT (DISTINCT page_key)> 1) ORDER BY pagelet_shingle; все еще медленно, как ад. – 2009-09-01 11:19:52