SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#26 19.02.2014 13:07:38

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5827

Re: Частичная очистка больших таблиц

Suguby написал:

А как проверить сваливалась ли?

Выполните вначале
SHOW SESSION STATUS LIKE ‘Created%’;
запомните значение Created_tmp_disk_tables
и после снова проверьте.

Решением в таком случае будет увеличение tmp_table_size и max_heap_table_size непосредственно перед запросом.
SET @@session.tmp_table_size := <value>;
SET @@session.max_heap_table_size := <value>;


Вероятно нужно будет увеличить перед выполнением запроса sort_buffer_size, чтобы не повис запрос с группировкой
SELECT id FROM temp GROUP BY id HAVING count(*)=3;

SET @@session.sort_buffer_size := <value>;
-- Выполнить запрос...
SET @@session.sort_buffer_size := DEFAULT;

Неактивен

 

#27 19.02.2014 13:45:35

Suguby
Участник
Зарегистрирован: 26.12.2011
Сообщений: 21

Re: Частичная очистка больших таблиц

SHOW SESSION STATUS LIKE ‘Created%’;
вроде по нулям после всех вставок.

Неактивен

 

#28 19.02.2014 18:47:42

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Частичная очистка больших таблиц

А если заменить DELETE на SELECT?

SELECT id FROM hits LEFT JOIN
                ( SELECT source_id FROM visits
                UNION SELECT start_page_id FROM visits
                UNION SELECT end_page_id FROM visits )
                    t ON hits.id=t.source_id
                WHERE t.source_id IS NULL;

или то же самое, но
CREATE TEMPORARY TABLE x SELECT ...

Неактивен

 

#29 20.02.2014 15:19:10

Suguby
Участник
Зарегистрирован: 26.12.2011
Сообщений: 21

Re: Частичная очистка больших таблиц

В итоге победил такой алгоритм:


            CREATE TEMPORARY TABLE temp AS SELECT hits.id FROM hits
                LEFT JOIN visits ON hits.id=visits.source_id
                    WHERE visits.source_id IS NULL;
            INSERT INTO temp SELECT hits.id FROM hits
                LEFT JOIN visits ON hits.id=visits.start_page_id
                    WHERE visits.start_page_id IS NULL;
            INSERT INTO temp SELECT hits.id FROM hits
                LEFT JOIN visits ON hits.id=visits.end_page_id
                    WHERE visits.end_page_id IS NULL;
            CREATE TEMPORARY TABLE temp2 AS SELECT id FROM temp GROUP BY id HAVING COUNT(*)=3;
            DELETE hits FROM hits JOIN temp2 USING (id);
            DROP TEMPORARY TABLE temp2;
            DROP TEMPORARY TABLE temp;
 

что-то около 10 минут на боевом.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson