|
|
|
Создание сложного запроса к большой таблице
|
|||
|---|---|---|---|
|
#18+
Добрый день! Проблема следующая: имеется таблица примерно с 1млн записей. Каждый день в таблицу записывается около 30-400 записей. Необходимо через определенный промежуток времени (пару месяцев) удалять из таблицы записи с сохранением только одной на каждый день. Выборку по одной записи на каждый день сделал так: Код: plsql 1. 2. 3. Выборку всех ненужных записей: Код: plsql 1. 2. 3. 4. А удаление планировал выполнить так: Код: plsql 1. 2. 3. 4. 5. Но в ответ MySQL надолго задумывается и ничего не возвращает. Изначально собирал запрос на тестовой маленькой таблице, так все проходило корректно. В таблице есть поля id, DateTime из несколько других с измерительной информацией. Работать нужно с полем DateTime. Прошу помощи или подсказать, как можно иным способом почистить таблицу от избыточных записей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2014, 10:27:02 |
|
||
|
Создание сложного запроса к большой таблице
|
|||
|---|---|---|---|
|
#18+
Leonid_Polenov, 1)вместо IN-подзапросов переписываете через джойны 2)если будет ругаться, что не может удалить, поскольку таблица уже задействована в селекте, то вытаскиваете все идшники удаляемых записей во временную таблицу и удаляете их из основной отдельным запросом ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2014, 10:30:41 |
|
||
|
Создание сложного запроса к большой таблице
|
|||
|---|---|---|---|
|
#18+
tanglir, Ok! Сейчас попробую сделать по вашему совету... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2014, 10:32:35 |
|
||
|
Создание сложного запроса к большой таблице
|
|||
|---|---|---|---|
|
#18+
tanglirесли будет ругаться, что не может удалить, поскольку таблица уже задействована в селекте, то вытаскиваете все идшники удаляемых записей во временную таблицу и удаляете их из основной отдельным запросом Лучше сделать вьюшку - нафига ему та таблица? лишняя нагрузка на диск и никаких профитов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2014, 10:38:46 |
|
||
|
Создание сложного запроса к большой таблице
|
|||
|---|---|---|---|
|
#18+
Подскажите, почему может помирать такой запрос: Код: plsql 1. 2. При этом часть с SELECT без создания временной таблицы исполняется довольно быстро. Каким способом иначе можно выбрать по одной записи за каждый день? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2014, 11:26:54 |
|
||
|
Создание сложного запроса к большой таблице
|
|||
|---|---|---|---|
|
#18+
Мануалы читать не пробовали? CREATE TABLE ... SELECT не предусматривает TEMPORARY. http://dev.mysql.com/doc/refman/5.6/en/create-table-select.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2014, 12:03:21 |
|
||
|
Создание сложного запроса к большой таблице
|
|||
|---|---|---|---|
|
#18+
Akina, Возможно, что и упустил((( Извиняюсь. Но с таблицей меньшего размера данная конструкция проходит отлично и создается временная таблица. Создание временной таблицы с использованием Select'а из другой с условием приведено и в русскоязычной книжке MySQL 5 в подлиннике 2010. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2014, 13:45:26 |
|
||
|
Создание сложного запроса к большой таблице
|
|||
|---|---|---|---|
|
#18+
AkinaМануалы читать не пробовали? CREATE TABLE ... SELECT не предусматривает TEMPORARY. http://dev.mysql.com/doc/refman/5.6/en/create-table-select.html Ээээ? CREATE TEMPORARY TABLE test SELECT 1; Status: ok mysql 5.6.19 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2014, 14:02:16 |
|
||
|
Создание сложного запроса к большой таблице
|
|||
|---|---|---|---|
|
#18+
Leonid_Polenov, Коллега, а попробуйте так: вот у вас день новый начался, сделайте еще одно поле, запишите туда некий id. Больше ничего в этот день не пишите, тогда у вас за весь день - только одна запись, остальные null, ага? далее просто удаляете из таблицы все, где это поле null - и не заморачиваетесь с выборкой. Index на дату + это поле - максимум, что потребуется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2014, 14:08:46 |
|
||
|
Создание сложного запроса к большой таблице
|
|||
|---|---|---|---|
|
#18+
UsersAkinaМануалы читать не пробовали? CREATE TABLE ... SELECT не предусматривает TEMPORARY. http://dev.mysql.com/doc/refman/5.6/en/create-table-select.html Ээээ? CREATE TEMPORARY TABLE test SELECT 1; Status: ok mysql 5.6.19Что это было? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2014, 14:21:54 |
|
||
|
Создание сложного запроса к большой таблице
|
|||
|---|---|---|---|
|
#18+
AkinaUsersпропущено... Ээээ? CREATE TEMPORARY TABLE test SELECT 1; Status: ok mysql 5.6.19Что это было? это был запрос с селектом, который создал TEMPORARY TABLE. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2014, 14:29:57 |
|
||
|
Создание сложного запроса к большой таблице
|
|||
|---|---|---|---|
|
#18+
AkinaМануалы читать не пробовали? CREATE TABLE ... SELECT не предусматривает TEMPORARY. http://dev.mysql.com/doc/refman/5.6/en/create-table-select.html Тоже не соглашусь. http://dev.mysql.com/doc/refman/5.6/en/create-table.html CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name [(create_definition,...)] [table_options] [partition_options] select_statement ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2014, 14:49:09 |
|
||
|
Создание сложного запроса к большой таблице
|
|||
|---|---|---|---|
|
#18+
Алё, народ... а по ссылке сходить не судьба? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2014, 16:33:56 |
|
||
|
Создание сложного запроса к большой таблице
|
|||
|---|---|---|---|
|
#18+
Usersэто был запрос с селектом, который создал TEMPORARY TABLE.Может, у меня плохо с арифметикой? я вижу ДВА запроса... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2014, 16:34:39 |
|
||
|
Создание сложного запроса к большой таблице
|
|||
|---|---|---|---|
|
#18+
Akina, Не ссорьтесь, горячие эстонские парни. Вот оригинальный запрос. CREATE TEMPORARY table currTemp as select id, DateTime FROM iis.current_32_54_1 -- where datetime < '2014-06-01' group by date_format(DateTime, '%Y-%m-%d'); Так вот, я кладу на наковальню, что он выполнится и таблицу currTemp создаст. А не создает ее только из-за условия where - которое я тут заремил. работает оно у топикстартера слишком долго и скорее всего, он этот запрос срубает. Два тут запроса или один - не суть важно. Если же буквоедствовать -то select тут один. :-Р ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2014, 16:48:12 |
|
||
|
Создание сложного запроса к большой таблице
|
|||
|---|---|---|---|
|
#18+
Всем большое спасибо! Решение найдено таким образом: Код: plsql 1. 2. 3. 4. 5. 6. 7. Все работает нормально, начальный запрос был рабочий, но видимо ресурсоемкий и по переменной Innodb_lock_wait_timeout блокировался. После этого БД не давала создать временные таблицы, но и это решилось только после рестарта mysql. Изменил и условие в GROUP BY с приведением к переменной Date, в этом случае приведение как раз и подошло и ускорило исполнение с 1,6 сек до 0,5 сек. Завернул в транзакцию, но возможно и не надо было? Общее исполнение около 5 сек с 203тыс. записями вполне устраивает... Еще раз большое спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2014, 17:23:29 |
|
||
|
Создание сложного запроса к большой таблице
|
|||
|---|---|---|---|
|
#18+
Leonid_Polenov Код: plsql 1. Уж сколько раз твердили миру... Вам совершенно все равно, какая именно запись из целого дня попадет в итоговую таблицу? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2014, 18:30:54 |
|
||
|
Создание сложного запроса к большой таблице
|
|||
|---|---|---|---|
|
#18+
Leonid_Polenov, Какое-то очень мудреное решение, имхо. Как минимум - три раза лопатим одну и ту же таблицу. Даже если там есть индекс - смысл по ней два раза проходиться? И переливать в нее то, что в ней и так было... Что сейчас 5 секунд на таблицу из 200 тысяч записей - по моему, многовато. Смотрите еще раз: 1 предложенный мной вариант - заводим еще одно поле. Пишем туда раз в день некий id, по нему и выбираем потом, какая именно запись из 20 тысяч за один день нужна. Делаем по полю индекс. Профит - выборка будет у вас очень быстрая. Удаление тоже. Никаких group by не нужно. Но будет масса дыр в identity поле и вообще смысл сначала писать в таблицу, а потом из нее массово удалять? 2 вариант: Вообще не трогаем эту вашу таблицу, а заводим новую, с такими же полями. Для совместной выборки делаем вьюху, обьединяющий старую и новую. В новую пишем данные за два месяца. в нужный момент перекидываете в старую - только те записи, которые выбираете сейчас группировкой - и так до следующего раза. Сюда же можно присовокупить идею из варианта 1. Профит: 1 - лопатить будете меньшее число записей. Записи более ранние, за тот же 2013 год в выборке сейчас у вас участвуют, у меня - не будут. 2. ускорение выборки - по сути, это секционирование. Если известно, данные за какой период нужны - можно искать их всего в одной таблице из моих двух и это будет быстрей, чем в вашем случае с одной общей под все. P.s. select * - это лоховство. Всегда пишите список и порядок полей в явном виде. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2014, 20:48:45 |
|
||
|
Создание сложного запроса к большой таблице
|
|||
|---|---|---|---|
|
#18+
miksoft, Мне нужна самая первая за день. В принципе так и происходит, изначально еще было в конце с order by но результат тот же. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2014, 22:19:54 |
|
||
|
Создание сложного запроса к большой таблице
|
|||
|---|---|---|---|
|
#18+
miksoftLeonid_Polenov Код: plsql 1. Уж сколько раз твердили миру... Что имелось ввиду? Если полезный совет - рад очень буду услышать)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2014, 22:22:56 |
|
||
|
Создание сложного запроса к большой таблице
|
|||
|---|---|---|---|
|
#18+
Leonid_Polenovmiksoftпропущено... Уж сколько раз твердили миру... Что имелось ввиду? Если полезный совет - рад очень буду услышать))При использовании в секции SELECT (и в любых других, которые исполняются после группировки) полей, которых нет в группировке приводит к тому, что для этих полей значения берутся из произвольной записи в пределах группы. И никак это изменить нельзя. По факту это обычно та запись, которая встретилась раньше в физическом порядке обработки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2014, 22:40:09 |
|
||
|
Создание сложного запроса к большой таблице
|
|||
|---|---|---|---|
|
#18+
Users, Вариант 1 действительно удобен, не знаю хорошо ли так реализовывать. Применить его не смогу, т.к. база существующая, не нормированная, воющем проблемная. Таких таблиц очень много для большого перчня устройств. И копаться в исходниках для применения варианта 1 и 2 очень трудоемко. Было бы интересно придумать запрос в меньшее количество операций и шустрее, конечно же. На счет select * все понятно, но в моем случае при работе с одной и той же таблицей не вижу нужды перечислять все столбцы. Если изменения коснуться этой таблицы - то для данных выражений проблем не будет... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2014, 23:28:14 |
|
||
|
Создание сложного запроса к большой таблице
|
|||
|---|---|---|---|
|
#18+
miksoft, То есть, если в таблице есть определенное кол-во записей, группируемых по некоторому полю, то значение других полей могут быть от других записей в пределах конкретной группы? Пример (абстрактный): Val1,Val2 1,2 1,7 2,1 2,4 Группируя по Val1 могу получить результат: 1, 7 2, 1 ? Если это так, то это повод изменять запрос ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2014, 23:42:30 |
|
||
|
Создание сложного запроса к большой таблице
|
|||
|---|---|---|---|
|
#18+
Leonid_PolenovНа счет select * все понятно, но в моем случае при работе с одной и той же таблицей не вижу нужды перечислять все столбцы.Мы тоже так когда-то думали... пока не натолкнулись на внезапно изменившийся порядок полей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2014, 23:43:23 |
|
||
|
Создание сложного запроса к большой таблице
|
|||
|---|---|---|---|
|
#18+
Leonid_PolenovПример (абстрактный): Val1,Val2 1,2 1,7 2,1 2,4 Группируя по Val1 могу получить результат: 1, 7 2, 1 ?Да, можете. Причем удаление/вставка записей может это изменить. Применение другого индекса это может изменить. Изменение запроса, например, добавлением JOIN-а с другой таблицей это может изменить. Leonid_PolenovЕсли это так, то это повод изменять запросТут целый FAQ на эту тему есть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2014, 23:47:19 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=38709088&tid=1834413]: |
0ms |
get settings: |
9ms |
get forum list: |
21ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
40ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
59ms |
get tp. blocked users: |
1ms |
| others: | 207ms |
| total: | 355ms |

| 0 / 0 |
