Практически один и тот же SQL-запрос может работать в десятки, сотни или даже тысячи раз быстрее!
Представь себе отчет, на формирование которого уходит пол дня. Аналитики с вечера его запускают и оставляют компьютер включенным. Утром, приходя на работу, они получают готовые данные. И это может быть реальная практика! Практически любой долго выполняющийся запрос можно оптимизировать. Я смог сделать так, чтобы выше описанный неповоротливый отчет стал выполняться заместо 5-6 часов за 5-6 секунд! Тогда мне сказали: наверное, я что-то поломал, так как уже все привыкли к нему, что его нужно ждать пока он откроется ("он же там что-то умное рассчитывает и долгая продолжительность - это нормально"). Но уже через несколько дней, после многих тестов на подозрительно быструю скорость, аналитики, не скрывая восхищения, сообщили, что я сделал невероятное! Отчет, как и прежде, продолжал отображать правильные данные. А я просто оптимизировал запрос, формирующий данные для отображения в нем.
Вот другой пример: банковскими системами, услугами мобильных- и туроператоров пользуются одновременно в реальном времени тысячи, а может и десятки тысяч человек. Подготовка и отображения баланса на счете в течение даже 10 секунд может стоить клиента! Ведь всегда приятно, когда все работает быстро! Можно найти банк, у которого в мобильном приложении все отображается быстро и удобно! Это называется «все летает», а не «тормозит».
И, чтобы еще больше подчеркнуть важность этой темы, сюда добавлю отношение к оптимизации запросов одного из авторов статей, на которых я и сам когда-то много подчерпнул про оптимизацию. Он восхищался скоростью отображения данных на медицинских приборах, иногда так важную, чтобы принять вовремя правильное решение, от которого, возможно, в определенный момент времени, даже может зависеть чья-то жизнь. Автор восторгался и скоростью отображения данных и у диспетчеров авиалайнеров. Где даже небольшая задержка недопустима.
Есть много приемов оптимизации запросов, но самый главный из них - это организация правильной выборки данных, использование индексов.
Вначале я объясню что такое индекс и для чего нужен. На своих очных занятиях я часто привожу ученикам следующий пример. Я даю одному из них большой словарь, например англо-русский, в котором несколько десятков тысяч слов, и прошу найти перевод некоторого слова, которое он заранее не знает. Ученик находит это слово за считанные секунды: сначала открывает страницы, где идут слова, начинающиеся на буквы, слова которого я просил перевести, затем находит нужное слово и говорит мне все о нем, и перевод, и даже примеры его использования (хороший словарик). Задание выполнено! Человек справился за несколько секунд, а машине (компьютеру) это вообще бы ничего не стоило! Потом я прошу его найти в словаре слова, вошедшие в речь в некотором веке. В словарике есть и подобная информация, указано, примерно в каком веке появилось то или иное слово. Для поддержания духа ученика, я сообщаю, что в словаре всего несколько слов, появившихся в таком-то веке. Ученик сразу теряется. Потому как для этого ему пришлось бы перелистать весь словарь. Просмотреть все страницы, все слова, проверив в каком веке каждое из них придумано.
То же самое и с таблицами в базах данных. Если мы будем выбирать данные из таблицы опираясь на один столбец (а не другой), например будем выбирать данные из таблицы «англо-русский переводчик» по столбцу «английское слово», то можем получить результат запроса быстро, а если по другому столбцу, например в этой же таблице по столбцу «век», то долго. Так что же делать, если время от времени будет требоваться выдавать список слов из словаря согласно веку? Не перелистывать же каждый раз всю таблицу заново. Конечно, машине это будет даваться быстрее, но, все же, вычитка такого объема данных с жесткого диска с целью поиска в нем нужной информации будет заметна. Выборка данных из таблицы-словарика по столбцу «век» пока будет стоить нам несколько заметных ресурсов. А если это будут запрашивать одновременно несколько пользователей, то нашей системе придется все время только и заниматься перебором строк этой относительно большой таблицы.
Теперь давайте представим, что в конце англо-русского словарика есть приложение. В нем в табличном виде указано на каких страницах искать слова, появившиеся в том или ином веке. Например, слова, появившиеся в таком-то веке, указаны на странице 18, 105, 204, 209 на строчках таких-то. Такая точная адресация облегчит нам поиск, а машине сократит время работы почти в ноль. Больше не нужно перебирать все строки таблицы «англо-русского словаря» в целях поиска записей, у которых в столбце «век» было бы нужное нам значение. Машина воспользуется «приложением к словарику», зайдет как бы на нужные страницы и просто возьмет сразу нужные данные. Фактически в таком «приложении» к таблице для каждого значения века указаны сразу адреса на жестком диске куда идти за данными в рамках нашей таблицы. Вот такое «приложение» к таблице – это и есть индекс! Фактически, это как бы системная дополнительная мини таблица, которую СУБД ведет сама. Проектируя любую таблицу в базе данных, мы можем указать для какого столбца нашей таблицы необходимо такое «приложение», необходим индекс.
Подведём итоги: мы разобрали что такое индекс – это справочная (вспомогательная) системная таблица к реальной нашей смысловой таблице, которую СУБД ведёт сама. Мы просто указываем для какого столбца нужен индекс (или для каких столбцов). Такое указание (создание индекса) может быть и после создания таблицы в базе данных, когда придёт понимание, что индекс необходим. Как создавать индексы, пользоваться планом выполнения запросов, делать выборки из таблиц или присоединять таблицы правильно, я объясняю на нашем Курсе "SQL. Базы данных. ORACLE. MS SQL Server. MySQL", а также в своей одноименной книге Самоучителю по языку SQL и базам данных. Буду рад, если придёшь к нам на курс обучения или купишь мою книгу.
Также немного про план выполнения запроса расскажу в следующей статье.
На нашем Youtube-канале найдёшь много интересного и полезного про базы данных и язык SQL.
Если есть Telegram, подписывайся на наш канал в Телеграмме. Несколько раз в неделю решаем вместе разные задачи по SQL, и ещё помогаю не выпадать из темы айти. Делюсь полезной информацией и техническим-юмором:)
А здесь ты можешь пройти наш курс обучения языку SQL и получить мощные знания и умения! Всего за 27 уроков до уровня специалиста, имеющего трёхлетний стаж. Много практики в реальной базе данных! С нашей поддержкой и проверкой твоих самостоятельный задач! Записывайся, буду тебя ждать!