SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 12.05.2016 15:54:08

Сергей11
Участник
Зарегистрирован: 12.05.2016
Сообщений: 5

Как в таблице найти пропущенные строки

Можете кто-нибудь помочь написать запрос. Таблицы скачать можно тут. Нужно в таблице 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)

Неактивен

 

#2 12.05.2016 16:46:39

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

Re: Как в таблице найти пропущенные строки

Сергей11 написал:

А получается что он строки где должно быть NULL просто пропускает и получается:

6040    6040
6042    6042
6045    6045

выводит правильно, но не в отсортированном виде, а т.к. результат большой, то возникает впечатление неверной работы.

Сергей11 написал:

Если добавить в запрос какие-то уточнения типа WHERE и т.д., то такой запрос начинает выполняться вообще до бесконечности даже если поставить ограничение LIMIT 0, 5. Вообщем как вывести пропущенные значения так и не понял. Можете кто сможет подсказать? Спасибо.

SELECT t1_copy.ID_moi
FROM t1_copy
LEFT JOIN t1
ON t1_copy.ID_moi = t1.ID_moi
where t1.ID_moi is null;


в выложенных файлах не таблицы. сделайте дамп этих таблиц. Скорее всего там просто нет индексов. И зачем в таблице t1_copy колонка id?

Ещё можно решить вашу задачу через переменные, но сейчас нет базы под рукой, чтобы написать запрос.

Неактивен

 

#3 12.05.2016 18:46:06

Сергей11
Участник
Зарегистрирован: 12.05.2016
Сообщений: 5

Re: Как в таблице найти пропущенные строки

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)

Неактивен

 

#4 12.05.2016 18:57:21

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

Re: Как в таблице найти пропущенные строки

покажите вывод команд
show create table t1;
show create table t1_copy;

mysql работает быстро, вероятно у вас стоят минимальные дефолтные настройки.

Неактивен

 

#5 12.05.2016 20:09:16

Сергей11
Участник
Зарегистрирован: 12.05.2016
Сообщений: 5

Re: Как в таблице найти пропущенные строки

У меня MySQL стоит локально и я работаю через Navicat. Может быть это из-за него?

vasya написал:

покажите вывод команд
show create table t1;
show create table t1_copy;

Вот эти (show create table t1;)?

https://lh3.googleusercontent.com/73FhvlqcaWNFOybIdKD7S9j8ZG75zHGNuIWT0qlCyFMZgNvldkq5lGKswQAZEbnv72cAu1sZGZtxnEDlXkS0y7vWO24v56SFRwX272CHiWXre7ZGZjngq7UjfI-_HymPCcw1zU0QJ2OcFilj61GYVrFOtAOFFGdbm3Vt4IRmSDS4BQvRfvQXYZ6eNKmzGAsTI7YWtfRH6XWHljf24eRBJCpC1KWeoqmeBEujgwbFeLN9RSPfBxeeUrPl3WbmtMPK0TYfQ46I5CS_F5sYsPWLv3B6xhEA8GEyj0hgXySsZDcVIuW5bprEAzlIqsXZl5TJ6G0EVtWacW8xDqR4BBOU-TGlITiAVsZ4Q8Jm2svD5rDu8kuTpjx2XF0WyyLwM9P_TXKDpW5WWlwUPbTMBbrWjBGRDNy5E7rKgh-1Unl-DqO4tXdWMGj3DlUtGx_o7_8aqdcrZ5W1pYk_WUGZ9ItaGP-uM9TGBRk8zPftK39FccVfsYmQShWjq_cIetVigvwQC7cm_sfFhG5ILyAZo0CO5wxQl10Mp07-U7yUV7JIY0DRdYImFf0WfNRiVXNjLGfX7vywg6WRMLSBr08uC7B8npXMd7vClx8=w281-h124-no


https://lh3.googleusercontent.com/ZqikRvllR5U23WFynV8EAmkqTswoqbuVXfiRsExvpdou66ghgTsKqK5M74y2PFxV8BQL6h1AuKgJ-x74JsQnxycNSXlDWXSDQKvoCuW-aYZYqHVVEPXgy-Im0OlRi3DyLVuZFDrpbELCMDvN4s67r9AJcbZ_2_K7RF-VZR2z2bhbDah-CYfb61G5k3opxy3EjL2Zpi1n8pnBrDbUSEidcS6ZB8ChiI_UkfmL6vLy4VD85rGEqJ6nuyMD7XMdiYMDPp9GBgUYVc5GkSZx-YYq7utILMBIjrb98b-RJqQaJ03WL6pUmCbTZPSIfGKDkmwmTjdcyNfVQZBvhM-Jk1nErHwFd1k7h0eQYlc7Tg_JH1mlPauproqE8L1Qglhvgm1dItNzPGqmmria4mHDtiEKyNF8fth7A79davpxtwoFgraUpTBd6wN2sGRGs4bCwdeM3pnAzspRkZpTZw4DHBUwgm5ySkrQ-w0eeA8k5tuq0V4C7bldDVMPrIxYLab6SXhSgKIupdItRQbyOP21Ycd0dOYYPGnyfNd8_SyTowZzjbkD-FadXLfF-SjLAb9Lousfmtel0H2AdzycRmSIw36U8Jpd8W2rdM4=w313-h124-no

https://lh3.googleusercontent.com/rxoYd5YGMFI8W5jvlDZABqh6cum9_MO-I9yZoFNHCpWhNHu4UBYuE4pVZsWKe5StqTJmV4Kw9KOQn4wrj2jbIlbR3UfmdvGtX4INGACtK-sDHpLbDC1ME6_xKgEsibetxeJzKpiRx6HGzTzFtzgipYE8Tt_Y18kQbMbBYA3nJmDBeApSP5ihS45IhLzWOTpUi3nvWRFS8QI35YoKFcHO1IF9pJap77gMQf0n7cjYKL5HvsOADUmxw9KyE526PME0Keo_yzuflmKWsJuqSTLcFlD5ydqkjX2hC6ghd2b9SRxNNDV3rPWIa7ivss0CjWbcj-LYL3oE8xorNcjW5byIQhS0Gx5CdkVfzqHm6KPfUqVaFuat_CWSIke3rdU7JZaHRLWNhYV07u-1hKSw_aNO7I0gBjtNFOuy7ZtrbVNrSi8Y06VhmgTmQpIctdUPUdfp5Esr1PiJjBkFgtJloU6luzjMCxAxPBZmsmpg8FyIyWrcZnmmSUwqSgg6J565T8H3aF4HvCM9jLyuj6lj9sGK9gZwl_xY-MiAtlFeI1zkoGSGfPsR4CnacQeJYSOuh9GWhUrSf5_CqdFkYjVrGBTBCKcEEbbxKPI=w472-h216-no

https://lh3.googleusercontent.com/wIi_ReXXqfOg8UcLmILErX65jwSXa-kj0zPmtgXW8QVCM38pg6Rg5tpiLdrRuE3m7tis7g0F9q_R1d9yvUtbMQy7ae_jKsGcQT66TV4TW_OGsiQ4PM5OFQ0pKo-CfR0vAQ88TTVwdiiaf87G-dFLjgTrTHzW8SAmy5Oi7TBJa3morCHr5-mFQd9lyAVX2BpgJgvAJCVJHIF6ZGMS2rIlU7rs3FwcztIAo5x5P63ILn9OxGSX_IJ9-hN6NI6V8WwsMLmokOsXdnCbM9j4i2OilZ6r3SiaJl9a_k7hP9Q8GYhx8ABi6TDnueZ5B352pi8Wuy_pA5xV1Ychxg6Qves5gLfEwIpQYma0GZSKcNIJbAFvE188vB_oZbRRhKQhNAf2GEQ9vomn37x_W26rftk21DwrkNnIklsvcoa1UCUQjUw-6aIt8OzRiqeX-njWqZ8aC1cGZMNv20e2HuMyFcRwz513m5W5x5yt6vF9z87P5y2k4tFgzI01tGwKu0VwKGbpMILeGZakU-pSZsuOk8h-BqU6Wib-clQBit6knmPQ47kGMTf5I8hd8ycpxZFaLn20rXXiI0-o6xrvtiBqsgwLd5fRr5ecIWs=w807-h394-no

show create table t1_copy;

https://lh3.googleusercontent.com/ibdfnqV7k5Ake9zNSZfvlqtkzk4FZeICpkTcXxYKibUmQOiTG5ayB2fp2_BDXCBlSLyPArDAaCIxTUz0ZK4XS7uMtNieqrnnapLjNvSQFTbPB5zaLde3wlQWU7LEegEqHblhPwgnJedj6u9IwkyPi6G8o3VFbvSPoi_KI0XdyUHj-9gFxfj1nnAsa06uUXl_nBiJ4pj36KSNWpMEHYSteDxF-Nwm-3I0SY5DsWTjCWB45rwC4UYm-3Z6L57FMoKLWrDEuv-Evf3CPqdIxjCkmNOv7_KKiR8OTFW2aSWe0_T88W-m5PvMIWymlukgmaJxg5cg4yGtihJ7GcQu76zvzYCwqZZ6LSVaJ91ILBuHIan84OVdY81M8Ys278gE2hojcezVD0rLZ480Hjc3aXTACX7r3fxEGpe2VKUR3TeX_dLxLFjb_YuHkOfLopPXEz5N8ZrwKcW9h_p8a0CAWQjqIMJPat4M0hAbKWRRE_6rerQ1szbfodwf0utafWA5PzTCCUCZAwmhaRZyliwXEyDP8UVBF1DQ3kJzGt78vQsyEe4vTlpZ7W6Hy4xC-LQt7rTlNUvRpdJ8nvpRW5gU9C7clYcJLyQZkxA=w257-h123-no

https://lh3.googleusercontent.com/R07SsJHMMp9Kctx2cbZE4wSwvjpCK4xV6m0fofNpl7Mn7epV5Y10_NgzJwBnhXiuzVEQJFBBNclsz3Q_RHPte535pzWuDVq9JZCGN7fSuYzHVge92AkgUIXJq0lHWoi_0lVnH7RvBjhrLZg1VYIjrxw8go9mQcrEnpn8xSacXHWWCWPnlS_grz85TZU5K8u26Vk2EDSZKZ4kSYOJXCwPUyncI76cjkTDb8Wol3I21WQLp6hBWsEKyquQUcMPTP9fr5MtBk6qKYWSCYJKi9XvJ4JFHUS9XER7tOhYUEKfTpxemqZxj1KDOgfBIfh4ccAlGT8Wkab1-OIZso9QLyl9RvmLdtBuppktlTLoA_JkCfASPEB72RQRZbsA9tKvb3jUBHS4QRR-7fgKjMtlCjlg48JSo_7IaUHlCZxlCkouNniaUvpxdvq7No2Pipf9a4-6vfMIqkxxoOw1kKiIA94Z1K2PZj-hiVN9DHL4ztT_S0ZfpgyfhW6B_sdNFSt6e7nxOlnBWgJ10D8eOKF_6IG8OHDThSJvjhpCpu8WpdmefrCY_Ock_FVBXm307XwUTlNg1JIxp0xcqKZm1HRqfDEsHuh8JGsJWu8=w266-h99-no

https://lh3.googleusercontent.com/EaUrlWlx1uhaMeQGw7V3CU0zUFE2IqXWQDNPXDeeNi6exg6Zo7v8QBz-m7_rhR_J93DD-px0u-SyXhVT0d9nc3rzB76sv9Odxz6UURSQa8Uuiv4h19KVPrTZj2MIGgvkVNfzl3XUWMlv0Kw_Zp3jjXZUmxJpLurYJF5lXSMFEmZxIP6GHOtJocd3zCW7pSbwBcuRi5q6v2efR8bFv3DgURAz229eEeeaD-1RYPFIWs83BGaIFD_K6cPKHyeKuIx6391EtUZIeQieC_BD5MC8jBn5-7OovxqfeREtW-O3qbiwyoHWOMp_v89pjQFQTP5OPFBoPtFW1Zr5Lw4FPh6DBMMefXa-8MeIYH33WxgUxbxJDeF0S-yIbdkHxqWacrcE9I4NOhu-tWIkVbPhZDykZ6Nneu3GOua6A_0WW-MW36JMdm4ObtWmlvbI9BggBcK4eeg4RlIDPGiiHVvEjjolrrWrDhZR71wpoyG3_oUsWWJhiZxs4IuqFmy9CxMZ-7ZcSFk57TP7HXbMsucdy8HWdSYkcNFMwSKg-2ALrq10DX0a5KAfyt13rYgtnTnqTut2aAzGGEEtlO93N3p7l0PKMdHlxyBvyUs=w483-h223-no

https://lh3.googleusercontent.com/HraB1b6cEzcg54ttbmU2PEc8SnzdpGzD6i8LMJoaXxA_K3jlDTv8Qznk97JXuZusIqz-ZUVNfK1ShcCu082uvuV7SDiSo-t_mD-w4frVP4HtO1qPPzb3YQEt8bcpRutFqH049OLMRt1If6ecZJE5ElXueUQpfp1iDv2X8lnXJcdO4yY8q_yZdy26Uvf1rQm3ECUb4yijTWBcGUnvwsCtelPokNBperw33aiysg_kNRRa_i12z2SnDEZsK4FE7nFmVAZLjw0MlfsJ_xyD_NDSpKihvRAXxvuSBG6c2ceItc-AAkEaYleYm4wuHNSDaXLfL29o3o6RAnQBzhkIjvu9RqKCbeRRJ5xKIU8QuAANqGXFNqyTotF5uaT5hyU7pBoJInKuIyEbL51PMjSrps8oXi65KG2gfpKLHho7tLIrq04YLgx4ELfcHsmTvpjpjeBJRlHoXibqOg-Arwe7Q3tMGG9Dua69P87uOcJhGxIKiwO13nMX-txC9ZbzyHAKyPP-y0EryhYtGHFLUskxZ1vBk1_O5ullFjUaAfz4EC6fb-jqWPVsQOqUqCDuHjfcMnaB8mxNmTHNzAoqgLklK7QVI4x5VNDo1Ts=w801-h387-no


vasya написал:

mysql работает быстро, вероятно у вас стоят минимальные дефолтные настройки.

Запрос на объединение 2 таблиц с 1.5мл строк (запрос который выше) сколько примерно должен выполняться?

Неактивен

 

#6 12.05.2016 20:31:41

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

Re: Как в таблице найти пропущенные строки

вторая картинка, там где вкладка result1
покажите полный вывод, возможно там нужно нажать правой кнопкой, чтобы скопировать в буфер или как-то растянуть (не пользовался этой прогой)
или выполните в консольном клиенте mysql

Неактивен

 

#7 12.05.2016 21:07:40

Сергей11
Участник
Зарегистрирован: 12.05.2016
Сообщений: 5

Re: Как в таблице найти пропущенные строки

vasya написал:

вторая картинка, там где вкладка result1
покажите полный вывод, возможно там нужно нажать правой кнопкой, чтобы скопировать в буфер или как-то растянуть (не пользовался этой прогой)
или выполните в консольном клиенте mysql

Вот так:

show create table t1;

https://lh3.googleusercontent.com/AtF6SpaCqh_nRlTFAfhwUut1NhM_fAut6jtnsOkHRJpiTEldJwwf5Cg6dPsrhmSE16joO_3YcvXzmz3_LK1d6MVqOahmq5y52jRff55idDRD_nf_egxtNJjmHhhEvrVUDKz5S3KuOrFR0r50xkEDbH9yuha3SKwvp496t9HZrNd8rnMOLvMqWTDjV3uyFaVTmI25yVeF3MhnBteja4qeXYlakZ2HZci4BjvaHqWy-9xVm8hhXXB4C5jQggrGjyP2fHeU7_EYKKBEiJ5JI0hevi6obrb4vCYN9drMUGypvD8zchPS4dIXR-LykpMkJDMAizuWC69PJ-Z3TNMNV3m0wmPPK8xx_vRFShlJjlC7iG0rgsJ-PxMxiFmoXEJVenc2dSocAcP2yoHaYs2zs0_ry4YSJY9-zW92Tmzlr5tH6txfzuxq-l-Igj0Byoo9B3jdSg6owyAw70VAzyhlfwdib2DEKdZgfau3gqhfl3UgSzKZxX8qk5rx52zhhtnMs5xflf2KNag2yXTjZOHQVUueNQuTGJfOyP1RanT_37wtNLY9zf9GztyElJ6gwCfTfY8_sraB7lwf98XCUNHQJ4cl9AjO0BMlCRw=w565-h379-no

show create table t1_copy;

https://lh3.googleusercontent.com/JbgOrtLeDo3P23QPHOoNfrEolrPy6hg7eg9njsbtiEyljNv_DEIcWDpNTa8OqQdXVCZieMP-2yWlSGWkgLz-2SeiAvNJ_Ii4a9eDbNR1EIL8ohVAYnW3GqaGTPe2Xuhx-KhRtTDoC2BT8kgAyqXG5BiPM5DcqudBCW6kzPH4GcVqtWu7uLyLTa5vgVuo7IkAtXT1v0_CetHfLTvWZyOwt12wjh81OPBEI7i2DosmMcBu3okgjbD9ilKAzLUIbchRyLG8OPCf7-IM4a6wIsK7DlVOSsZ3DeCpPAM0t5RLFqbQ2oZdX1iUFZi1hoLI0OAEa-nfbIUzHGqSDZWRDqYje93yBx0CF3gYWmK40dRD8a2im5SM8y8T4flPuRdczoGERdamHQxSa7gMzC2KVHDNSMpWR1hPsys0CJrgu_pZiGAbXOi9eXQDjcIci_Aj4sgeGUvdMyRQUpkkTYqGCeafTwCmRDtyZllLIhsQVR3CrN6HymXMCqpljeJynuqEbmT7AuH5QIU4easpaMrSz7bse0zdqYERDPJFwylPKjxn-7UXmyWxSCSWy1-oyrwnxx6P8LQkGTMkdoPI1Fx8PxAzVerDl9kq7f8=w639-h291-no

Неактивен

 

#8 12.05.2016 21:16:17

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

Re: Как в таблице найти пропущенные строки

id_moi уникальный?
alter table t1 add unique (id_moi);

а почему он varchar(255) а не int?

Неактивен

 

#9 12.05.2016 21:16:53

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

Re: Как в таблице найти пропущенные строки

ну и в t1_copy оставить только id_moi

Неактивен

 

#10 12.05.2016 21:20:13

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

Re: Как в таблице найти пропущенные строки

create table t1_copy (id_moi int not null primary key);

в таблице t1:
поле id_moi может принимать null? (аналогично name, lname)
id нужно?

Неактивен

 

#11 12.05.2016 21:40:21

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

Re: Как в таблице найти пропущенные строки

Резумируя, вам нужно сделать, как минимум:


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;


после чего проверить скорость выполнения запроса.

Неактивен

 

#12 12.05.2016 23:52:55

Сергей11
Участник
Зарегистрирован: 12.05.2016
Сообщений: 5

Re: Как в таблице найти пропущенные строки

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 сек.

Неактивен

 

Board footer

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