|
|
|
Оптимизация запроса с большим объемом данных
|
|||
|---|---|---|---|
|
#18+
Добрый день. Прошу помощи у профессионалов по ускорению запроса для Mysql Есть таблица email_subscribe с набором значений: Код: sql 1. 2. 3. 4. 5. 6. Необходимо получить дубликаты по полю "ekey", которые в дальнейшем можно удалить Сделал 2 запроса, они выводят, список нужных дублей по полю "ekey", которые можно потом удалить... Код: sql 1. 2. 3. Код: sql 1. 2. Результат двух запросов правильный и идентичный: Код: sql 1. 2. 3. 4. Проблема в том, что при больших объемах данных (если в таблице email_subscribe будет 700 000 записей) эти запросы очень долго выполняются, не могу дождаться завершения запроса на локальном хосте при ~160 000 строк Индексы по нужным полям таблицы email_subscribe поставил Привожу explain запроса: Код: sql 1. 2. Привожу explain запроса: Код: sql 1. 2. 3. В чем причина длительного выполнения обоих запросов? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2015, 20:05:17 |
|
||
|
Оптимизация запроса с большим объемом данных
|
|||
|---|---|---|---|
|
#18+
sanich, Каков общий уровень дубликатов в поле ekey? Если 99% значений уникальны, то это одно. А если каждое из значений повторяется сотни-тысячи раз, то это другое. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2015, 20:10:37 |
|
||
|
Оптимизация запроса с большим объемом данных
|
|||
|---|---|---|---|
|
#18+
Не очень понял ваши эксперименты с группировкой. Почему не сделать проще: Код: sql 1. 2. 3. ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2015, 20:13:17 |
|
||
|
Оптимизация запроса с большим объемом данных
|
|||
|---|---|---|---|
|
#18+
Код: sql 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2015, 20:41:58 |
|
||
|
Оптимизация запроса с большим объемом данных
|
|||
|---|---|---|---|
|
#18+
sanichНеобходимо получить дубликаты по полю "ekey", которые в дальнейшем можно удалить Давайте всё-таки без допущений. Либо мы их удаляем (тогда нафига их получать), либо получаем (тогда к чему разговор за удаление). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2015, 20:56:07 |
|
||
|
Оптимизация запроса с большим объемом данных
|
|||
|---|---|---|---|
|
#18+
sanich, хочется задать уточняющий вопрос: Зачем эти дубли туда добавлять? Bad design? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.10.2015, 09:50:03 |
|
||
|
Оптимизация запроса с большим объемом данных
|
|||
|---|---|---|---|
|
#18+
DBConstructorsanich, хочется задать уточняющий вопрос: Зачем эти дубли туда добавлять? Bad design? недочеты работы программистов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.10.2015, 15:26:01 |
|
||
|
Оптимизация запроса с большим объемом данных
|
|||
|---|---|---|---|
|
#18+
AkinasanichНеобходимо получить дубликаты по полю "ekey", которые в дальнейшем можно удалить Давайте всё-таки без допущений. Либо мы их удаляем (тогда нафига их получать), либо получаем (тогда к чему разговор за удаление). Надо получить, для того чтобы в дальнейшем обработать эти записи, есть другая таблица где похожая ситуация с дублями и там нужно просто удалить дубликаты ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.10.2015, 15:27:21 |
|
||
|
Оптимизация запроса с большим объемом данных
|
|||
|---|---|---|---|
|
#18+
miksoftНе очень понял ваши эксперименты с группировкой. Почему не сделать проще: Код: sql 1. 2. 3. ? Этот запрос выводит список записей в которых уникально поле ekey, а надо не уникальные записи а вытатащить все дубликаты по полю ekey... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.10.2015, 15:56:29 |
|
||
|
Оптимизация запроса с большим объемом данных
|
|||
|---|---|---|---|
|
#18+
sanichmiksoftНе очень понял ваши эксперименты с группировкой. Почему не сделать проще: Код: sql 1. 2. 3. ? Этот запрос выводит список записей в которых уникально поле ekey, а надо не уникальные записи а вытатащить все дубликаты по полю ekey...Вообще-то нет. Этот запрос выводит записи со всеми значениями поля ekey и с одним значением поля id. Т.е. по сути это то, что осталось бы после удаления дубликатов. Чтобу получить значения поля ekey, которые имеют дубликаты в таблице, то нужен такой запрос: Код: sql 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.10.2015, 16:06:24 |
|
||
|
Оптимизация запроса с большим объемом данных
|
|||
|---|---|---|---|
|
#18+
sanichДобрый день. Прошу помощи у профессионалов по ускорению запроса для Mysql Есть таблица email_subscribe с набором значений: Код: sql 1. 2. 3. 4. 5. 6. Необходимо получить дубликаты по полю "ekey", которые в дальнейшем можно удалить Сделал 2 запроса, они выводят, список нужных дублей по полю "ekey", которые можно потом удалить... Код: sql 1. 2. 3. Код: sql 1. 2. Результат двух запросов правильный и идентичный: Код: sql 1. 2. 3. 4. оба запроса неверные и случайно идентичные ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.10.2015, 17:37:15 |
|
||
|
Оптимизация запроса с большим объемом данных
|
|||
|---|---|---|---|
|
#18+
sanich, еше раз уточните задачу. если , допустим имеется две записис одинаковым ЕКЕУ. вам нужно: 1. выбрать обе 2. выбрать последнюю (первую) по какомунибудь аттрибуту 3. выбрать любую точно также уточните про удаление. Надо оставить: 1. ОДНУ последнюю (первую) по ИД или таймстампу или по какомунибудь статусу 2. ОДНУ любую из нескольких ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.10.2015, 17:42:27 |
|
||
|
Оптимизация запроса с большим объемом данных
|
|||
|---|---|---|---|
|
#18+
javajdbcsanich, еше раз уточните задачу. если , допустим имеется две записис одинаковым ЕКЕУ. вам нужно: 1. выбрать обе 2. выбрать последнюю (первую) по какомунибудь аттрибуту 3. выбрать любую точно также уточните про удаление. Надо оставить: 1. ОДНУ последнюю (первую) по ИД или таймстампу или по какомунибудь статусу 2. ОДНУ любую из нескольких Отвечаю: еше раз уточните задачу. если , допустим имеется две записис одинаковым ЕКЕУ. вам нужно: 1. выбрать обе 2. выбрать последнюю (первую) по какомунибудь аттрибуту 3. выбрать любую точно также уточните про удаление. Надо оставить: 1. ОДНУ последнюю (первую) по ИД или таймстампу или по какомунибудь статусу 2. ОДНУ любую из нескольких Постараюсь на пальцах, чтобы исключить недопонимание, есть таблица со значеними: Код: sql 1. 2. 3. 4. 5. 6. Мне нужно выбрать только те строки, в которые повторяются по полю ekey, причем 1 дубликат не брать в расчет, т.е. мне надо получить: Код: sql 1. 2. 3. 4. Запрос вида: Код: sql 1. 2. Выводит, как раз то что мне надо, я не знаю почему javajdbc считает его неправильным, но этот запрос на большом объеме данных не выполняется. Далее, miksoft привели запрос, он выполняется быстро: Код: sql 1. 2. 3. 4. Но он выводит результат неверный: Код: sql 1. 2. а должно быть: Код: sql 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.10.2015, 20:13:38 |
|
||
|
Оптимизация запроса с большим объемом данных
|
|||
|---|---|---|---|
|
#18+
Код: sql 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.10.2015, 20:32:31 |
|
||
|
Оптимизация запроса с большим объемом данных
|
|||
|---|---|---|---|
|
#18+
Lumix Код: sql 1. 2. 3. 4. 5. результат: Код: sql 1. 2. а должно быть: Код: sql 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.10.2015, 21:02:20 |
|
||
|
Оптимизация запроса с большим объемом данных
|
|||
|---|---|---|---|
|
#18+
Ну тогда, кажется, так: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. или так: Код: sql 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.10.2015, 21:34:16 |
|
||
|
Оптимизация запроса с большим объемом данных
|
|||
|---|---|---|---|
|
#18+
miksoft, я что-то не так всекаю или оба два запроса у него вроде как в самом исходном посте и прописаны... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.10.2015, 21:47:24 |
|
||
|
Оптимизация запроса с большим объемом данных
|
|||
|---|---|---|---|
|
#18+
Lumixmiksoft, я что-то не так всекаю или оба два запроса у него вроде как в самом исходном посте и прописаны...Да, мой первый похож на первый запрос в исходном посте, только более корректно написан. Это мы уже круг сделали и вернулись примерно туда же, где и были :) Для быстрого выполнения моих вариантов нужен индекс (ekey, id). Теоретически, самый быстрый вариант можно написать на переменных. Тогда можно будет обойтись одним сканированием индекса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.10.2015, 21:54:05 |
|
||
|
Оптимизация запроса с большим объемом данных
|
|||
|---|---|---|---|
|
#18+
sanich, вы поставили вопрос: как ускорить запрос. На всякий случай сообщаю, как бы мы сделали в подобном случае, если бы стояла задача не ускорить запрос, а "*****, ну сделайте ЧТО-НИБУДЬ, чтобы было все быстро ну ваще")))))) Шаг 1. Добавляем флаг. Код: sql 1. 2. Шаг 2. Маркируем его. Код: sql 1. 2. 3. 4. 5. Шаг 3. Достаем дубли Код: sql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.10.2015, 22:22:14 |
|
||
|
Оптимизация запроса с большим объемом данных
|
|||
|---|---|---|---|
|
#18+
sanichВыводит, как раз то что мне надо, я не знаю почему javajdbc считает его неправильным признаю что был не прав --- уж очень редко задача стоит в оставление любой из повторяюшихся записей. Обычно всеже ставят условие первый/последний. Кстате, под любой можно принять "сохранить первую", тогда так: Код: sql 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.10.2015, 23:45:40 |
|
||
|
Оптимизация запроса с большим объемом данных
|
|||
|---|---|---|---|
|
#18+
javajdbc Код: sql 1. 2. 3. 4. 5. javajdbc, чисто ради интереса: а для чего в этом запросе distinct? это такой трюк для левых джоинов, да??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2015, 00:03:43 |
|
||
|
Оптимизация запроса с большим объемом данных
|
|||
|---|---|---|---|
|
#18+
Lumixjavajdbc Код: sql 1. 2. 3. 4. 5. javajdbc, чисто ради интереса: а для чего в этом запросе distinct? это такой трюк для левых джоинов, да??? если на один ЕКЕУ имеется 3 ид id1, id2, id3 то последний выйдет 2 раза по условию id3 > id1, id3>id2 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2015, 00:10:52 |
|
||
|
Оптимизация запроса с большим объемом данных
|
|||
|---|---|---|---|
|
#18+
javajdbcесли на один ЕКЕУ имеется 3 ид id1, id2, id3 то последний выйдет 2 раза по условию id3 > id1, id3>id2 получается, что с помощью условий мы что ли как-то можем влиять на дисинкт и "загнать" его так, чтобы он отдавал либо максимум, либо минимум?? я просто всегда думал, что дистинкт всегда берет первое попавшееся, то есть как бы его выбор это всегда not-determined ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2015, 00:31:06 |
|
||
|
Оптимизация запроса с большим объемом данных
|
|||
|---|---|---|---|
|
#18+
Lumixjavajdbcесли на один ЕКЕУ имеется 3 ид id1, id2, id3 то последний выйдет 2 раза по условию id3 > id1, id3>id2 получается, что с помощью условий мы что ли как-то можем влиять на дисинкт и "загнать" его так, чтобы он отдавал либо максимум, либо минимум?? я просто всегда думал, что дистинкт всегда берет первое попавшееся, то есть как бы его выбор это всегда not-determinedЭто вы с GROUP BY путаете. А DISTINCT всегда детерминистичен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2015, 00:38:18 |
|
||
|
Оптимизация запроса с большим объемом данных
|
|||
|---|---|---|---|
|
#18+
Lumixполучается, что с помощью условий мы что ли как-то можем влиять на дисинкт и "загнать" его так, чтобы он отдавал либо максимум, либо минимум??Нет, distinct просто уберёт повторы id-ов для тех ekey, у которых больше двух записей. Никакими условиями на него "повлиять" не получится. miksoftЭто вы с GROUP BY путаете. А DISTINCT всегда детерминистичен. А вот тут уже я не понял. Вроде бы distinct on() order by ... в мускле ещё нет и не предвидится. Или о чём вообще речь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2015, 06:01:06 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=39090519&tid=1832532]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
39ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
71ms |
get tp. blocked users: |
1ms |
| others: | 204ms |
| total: | 357ms |

| 0 / 0 |
