Задавайте вопросы, мы ответим
Вы не зашли.
Можете кто-нибудь помочь написать запрос. Таблицы скачать можно тут. Нужно в таблице t1 в столбце ID_moi найти пропущенные значения. Для этого создал таблицу t1_copy в которой есть столбец ID_moi со всеми значениями по порядку. В таблице 1.5 мл строк и в будущем будет еще больше. Можно ли написать запрос так чтобы выполнялся не больше 1-2 часов?
Пробовал через таки запрос:
SELECT t1_copy.ID_moi, t1.ID_moi
FROM t1_copy
LEFT JOIN t1
ON t1_copy.ID_moi = t1.ID_moi
Запрос почему-то выводит все совпадающие значения. Т.е должно по идее так:
6040 6040
6041 NULL
6042 6042
6044 NULL
6044 NULL
6045 6045
А получается что он строки где должно быть NULL просто пропускает и получается:
6040 6040
6042 6042
6045 6045
Если добавить в запрос какие-то уточнения типа WHERE и т.д., то такой запрос начинает выполняться вообще до бесконечности даже если поставить ограничение LIMIT 0, 5. Вообщем как вывести пропущенные значения так и не понял. Можете кто сможет подсказать? Спасибо.
Отредактированно Сергей11 (12.05.2016 15:59:06)
Неактивен
Сергей11 написал:
А получается что он строки где должно быть NULL просто пропускает и получается:
6040 6040
6042 6042
6045 6045
выводит правильно, но не в отсортированном виде, а т.к. результат большой, то возникает впечатление неверной работы.
Сергей11 написал:
Если добавить в запрос какие-то уточнения типа WHERE и т.д., то такой запрос начинает выполняться вообще до бесконечности даже если поставить ограничение LIMIT 0, 5. Вообщем как вывести пропущенные значения так и не понял. Можете кто сможет подсказать? Спасибо.
Неактивен
vasya написал:
результат большой, то возникает впечатление неверной работы.]
Точно. Только что сделал точно такие же таблицы, только строк поменьше. Этот запрос, который выше выводит почему-то строки с NULL в самый конец вот так:
6040 6040
6042 6042
6045 6045
6041 NULL
6044 NULL
6046 NULL
Соответственно если поставить лимит LIMIT 0, 20, то я так понимаю запрос до конца таблицы не доходит и строк с NULL не было видно.
vasya написал:
в выложенных файлах не таблицы. сделайте дамп этих таблиц.
Вот добавил в формате sql тут https://yadi.sk/d/2WVtevhdrfQ5S
vasya написал:
Скорее всего там просто нет индексов.
Есть индекс в основной таблит. (t1) на поле email для проверки уникальности. Еще какие-то индексы нужны?
vasya написал:
И зачем в таблице t1_copy колонка id?
Я пробовал все подрядят. Думал может проблема в том что нет столбца с ID. В принципе он не нужен ..можно удалить.
vasya написал:
Ещё можно решить вашу задачу через переменные, но сейчас нет базы под рукой, чтобы написать запрос.
Как время будет можете помочь написать. Очень нужно. Т.к. в таблицу планирую добавить очень много строк (до 1 миллиарда) и потом не хотелось бы ждать неделями выполнения любого запроса.
Вообще я думал MySQL быстро работает. Оказывается excel 2016 быстрее работает, но у него др. сложности.
Отредактированно Сергей11 (12.05.2016 18:53:46)
Неактивен
покажите вывод команд
show create table t1;
show create table t1_copy;
mysql работает быстро, вероятно у вас стоят минимальные дефолтные настройки.
Неактивен
У меня MySQL стоит локально и я работаю через Navicat. Может быть это из-за него?
vasya написал:
покажите вывод команд
show create table t1;
show create table t1_copy;
Вот эти (show create table t1;)?
show create table t1_copy;
vasya написал:
mysql работает быстро, вероятно у вас стоят минимальные дефолтные настройки.
Запрос на объединение 2 таблиц с 1.5мл строк (запрос который выше) сколько примерно должен выполняться?
Неактивен
вторая картинка, там где вкладка result1
покажите полный вывод, возможно там нужно нажать правой кнопкой, чтобы скопировать в буфер или как-то растянуть (не пользовался этой прогой)
или выполните в консольном клиенте mysql
Неактивен
vasya написал:
вторая картинка, там где вкладка result1
покажите полный вывод, возможно там нужно нажать правой кнопкой, чтобы скопировать в буфер или как-то растянуть (не пользовался этой прогой)
или выполните в консольном клиенте mysql
Вот так:
show create table t1;
show create table t1_copy;
Неактивен
id_moi уникальный?
alter table t1 add unique (id_moi);
а почему он varchar(255) а не int?
Неактивен
ну и в t1_copy оставить только id_moi
Неактивен
create table t1_copy (id_moi int not null primary key);
в таблице t1:
поле id_moi может принимать null? (аналогично name, lname)
id нужно?
Неактивен
Резумируя, вам нужно сделать, как минимум:
Неактивен
vasya написал:
Резумируя, вам нужно сделать, как минимум:
alter table t1 modify id_moi int not null;
alter table t1 add unique (id_moi);
alter table t1_copy drop `key`;
alter table t1_copy modify id_moi int not null auto_increment primary key;
после чего проверить скорость выполнения запроса.
Спасибо большое что так подробно написали. Вроде разобрался. Теперь запрос выполняется за 18 сек.
Неактивен