Skip to content

Instantly share code, notes, and snippets.

Created September 12, 2017 15:01
Show Gist options
  • Save anonymous/afc63225ba3d5bb60a91c5094ff2545f to your computer and use it in GitHub Desktop.
Save anonymous/afc63225ba3d5bb60a91c5094ff2545f to your computer and use it in GitHub Desktop.
Поиск значенияв mysql

Поиск значенияв mysql



Поиск ближайших значений в MySQL
Справочник по MySQL : SQL : Поиск записей в таблице(SELECT)
MySql. Поиск слова или строки в базе данных MySql

Только полноправные пользователи могут оставлять комментарии. TM Feed Хабрахабр Geektimes Тостер Мой круг Фрилансим. Хабрахабр Публикации Пользователи Хабы Компании Песочница. Разработчики и администраторы систем основанных на sql данных, наверняка, сталкивались с задачей — получить отсутствующее пропущенное значение в ряде id записей таблицы. Например номер договора, порядковый номер документа, телефонный номер, айпи-адрес и т. При работе с MySQL эта тривиальная задача непропорционально ресурсоемка. Например, у нас есть пул внутренних телефонных номеров компании от до и таблица с выданными из них номерами для сотрудников: Если свободных значений нет, то нужно выделить следующий из диапазона. Решения, которыми изобилует интернет, сводятся к двум принципам: Цикл можно делать и любым внешним софтом, смысл принципа не меняется. WHERE phone NOT IN На маленьких объемах данных оба решения и даже с IN прекрасно работают, а при большом количестве записей эти решения либо ресурсоемки, либо продолжительны во времени, либо и то и другое. Зависит от мощностей сервера и настроек базы, но в любом случае если перебирать миллион записей или приджойнить такую таблицу, даже на мощном сервере выполнение займет заметное время. Я же захотел решить задачу быстро, не напрягая сервер, и, желательно, в один запрос. В один, не в один, но вот что получилось: Прекрасное решение подсказал в личке участник stepmex Без всякого дополнительного построения нумерации и сравнений рядов, изящно решил задачу через SELECT IS NULL Великолепная находка, я считаю: Программирование 2,9k авторов , 6,5k публикаций. Информационная безопасность 2,4k авторов , 6,4k публикаций. Разработка под Linux автора , публикации. Java 1,1k авторов , 2,2k публикаций. Open source 1k авторов , 2,3k публикаций. Системное программирование авторов , публикаций. Разработка под Android 1k авторов , 2,2k публикаций. C авторов , публикаций. JavaScript 1,9k авторов , 4k публикаций. ES8 вышел и вот его основные новые возможности 11,7k Добавить в закладки Если честно, не понял ваш алгоритм, вернее, разбираться лень. У меня такая мысль возникла. Можно что-то типа бинарного поиска сделать, если индекс на колонку есть. Далее делим нужную половину опять попалам и т. Да, была у меня и такая мысль. Но это итерационный метод, просто с меньшим кол-вом итераций. Но по сути — преребор сумм значений. Проверял на таблицах порядка миллиона записей, итерационно или джойн — все равно занимали секунд, мой запрос 0,3 секунды. При наличии правильного индекса, достаточном количестве памяти и количественном ограничении выборки id от до не должно быть 30 секунд, никак. Курсор в принципе медленная штука, потому его надо использовать, только когда не помогает ничего. А так — лично я вижу всего две выборки, в случае, когда оптимизатор не справляется с одной. Проверял на таблицах порядка миллиона записей Список из тысячи телефонов — пример. Индексы могут быть, а могут и не быть, и данные из ряда могут быть в разных форматах. Например есть таблицы занятых айпи-адресов: И, тем более, зачем в разных форматах? Этот жеж микроскоп, не надо им махать. Например разными разработчиками в разное время писался разный софт, использующий по сути одни и те же данные для разных задач. В результате софт работает, а вот с данными — беда. И если это было бы возможно, то конечно — хорошее решение. Но ситуации и системы бывают разные. Отсюда и родилось решение. А пример с телефонными номерами в одной таблице — это только пример, для пояснения алгоритма. Ответил уже youlose чуть выше. В уменьшении времени поиска и нагрузки на сервер, Повторюсь — пример с телефонными номерами — только пример. Ещё можно однократно сделать табличку с одним столбцом и в качестве данных использовать последовательность чисел нужного диапазона. Ну а дальше легко найти пропуски с помощью LEFT JOIN. Ну а последовательность легко генерируется: Это один из первых вариантов, которые используют для решения задачи, я описал его в посте. Но, он не оптимален, и ресурсоемок, что становится заметно при большом кол-ве данных. Мое решение и есть снятие этой лишней нагрузки. Если у вас есть данные по скорости выполнения запросов для сравнения, было бы интересно самому. Зависит от конфигурации и мощности сервера, но для сравнения При наличии в таблице t1 миллиона записей запрос SELECT MIN t1. А зачем MIN pool. Конечно он будет выполняться уйму времени, ведь он пробегает все телефоны, затем ищет минимальный. Если вместо этого сделать LIMIT 1 и добавить ORDER BY , запрос выполнится как раз за 0. Будет зависеть от данных конечно, но мне кажется ордеру больше памяти потребуется. Есть ещё один метод, который Вы не упомянули: Тогда INSERT будет предельно краток — берем минимальный номер из нашей таблицы, а если она пустая — то создаем новый номер. На большом кол-ве INSERT-ов это выльется в ощутимую экономию ресурсов. Обновлять таблицу тоже можно в удобное время когда есть запас по ресурсу. Вообще, мне кажется, что держать пул всех номеров — это правильно в вашем случае. В таком случае ваша проблема не появляется. НЛО прилетело и опубликовало эту надпись здесь. Вообще — даже не обязательно держать пул всех номеров — достаточно держать его заполненным в достаточной мере, чтобы хватило до следующего заполнения. А нельзя сделать хранимую процедуру следующего вида? Выбрать все номера из таблицы 2. Цикл по результатам запроса 1, начиная со второго элемента 2. Если предыдущий номер не равен текущий номер — 1, вернуть текущий номер Получился бы один SELECT на этапе 1. Самое забавное, что я именно такую функцию с курсором и переделал. Изначально задача и была решена хранимой процедурой с циклом внутри. Разве в MySql нет MINUS? Minus нет, но подобное вычитание запрос минус запрос выполняется left join-ом. Только искать этим запросом придётся по одному, т. Тогда как с генерированным пулом можно выявить сразу все номера за один запрос. Мой запрос тоже только одно минимальное значение сможет выдать, то есть в нем, после первого же расхождения num! Единственное, надо бы проверить время выполнения на реальных иногда кривых данных. Метки лучше разделять запятой. Сейчас Вчера Неделя ES8 вышел и вот его основные новые возможности 11,7k Интересные публикации Хабрахабр Geektimes. Вы используете интерфейсы в Go неправильно!. Как поставить Ubuntu на RPI и подключить к Azure IoT Hub. В Росстандарт подали проект национального стандарта NB-FI для Интернета вещей GT. Стек, который позволил Medium обеспечить чтение на 2. Поглотит ли квантовая механика реальность? Челенджи, брейк-пойнты, сеты и победы — обработка информации на Уимблдоне с помощью IBM Watson GT. В США начинается акция за сохранение сетевого нейтралитета GT. Разделы Публикации Хабы Компании Пользователи Песочница. Информация О сайте Правила Помощь Соглашение Конфиденциальность. Услуги Реклама Тарифы Контент Семинары.


Слива восход описание сорта
Перевод имени рамазан
Сводит рукии кистичто делать
Amazing перевод слова
Осветляющее масло для волос лореаль
Спрей краски каталог
Айфон 6s где дешевле
Газпромбанк саратов адреса
Понятие себестоимости и виды затрат
Как правильно фотографироваться на улице
Ремонт трубы глушителя своими руками без сварки
Таблица критических точек распределения хи квадрат
Выпуски средних таблиц ббк
Правила продажи транспортных средств
Terramont volkswagen характеристики
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment