Как поставить Joomla 4 на выделенный сервер VDS/VPS?

Ставим Джумлу на выделенный сервер (стек LEMP), настраиваем фаервол и переносим готовый сайт на второй сервер. Linux, консоль. Ready, steady, go!
 
Что делаем?
Устанавливаем Nginx, PHP, MySQL, Joomla, настраиваем фаервол и ограничиваем количество неудачных попыток входа с помощью fail2ban. Затем переносим работающий сайт на другой сервер. Бонус: Топ-20 лучших бесплатных расширений для Джумлы и советы по ее ускорению.

Эту инструкцию по настройке сервера можно использовать почти с любой CMS на PHP и MySQL: Wordpress, Drupal, MODX, October CMS и т. д.

1. Создаем сервер

Редакция выделила бюджет, поэтому берем сервер помощнее. Например, провайдер IT-инфраструктуры Selectel предлагает серверы, оснащенные 4-768 ГБ ОЗУ, 2-72 ядрами ЦП, возможность подключить графический ускоритель и выбрать в качестве сервера даже Raspberry Pi 4 (4/64 ГБ) и Mac mini для iOS-разрабов. Плюс, быстрая тех. поддержка, наличие резервного копирования и API. Такие серверы предназначены для нескольких десятков небольших сайтов или одного крупного.

Устанавливаем и переустанавливаем Windows 10: пошаговая инструкция, нюансы, тонкости и подводные камни

В статье описываются основные преимущества и недостатки Windows 10. Приводится пошаговая инструкция по установке и переустановке операционной системы. Рассматриваются проблемы, которые могут возникнуть, и способы их решения.
 
Windows 10: основные преимущества и недостатки
Корпорация Microsoftвыпустила Windows 10 в 2015 году с целью формирования единой экосистемы для различных устройств. Такая «кроссплатформенность» должна была гарантировать получение определенных преимуществ в борьбе за место на рынке операционных систем для смартфонов, ПК, планшетов и консолей. Сейчас уже вышла Windows 11, но предыдущая версия системы еще долго будет актуальной во многом из-за новых требований к совместимости, которые не позволяют обновить операционку на вполне пригодных для работы компьютерах.

Потеснить конкурирующие продукты оказалось не так просто: Android и iOS по-прежнему доминируют на мобильных платформах и сдавать позиции в обозримом будущем не собираются. Тем не менее для достижения поставленной цели разработчики Microsoft предложили пользователям целую кучу интересных «плюшек»:

  • Стало возможным выполнение задач привычным способом на любых устройствах.
  • Windows 10 можно установить даже на маломощных устройствах.
  • Обеспечена высокая скорость загрузки и работы.
  • Для переустановки операционной системы достаточно нажать одну кнопку.
  • Улучшилась производительность, функциональность и защищенность системы.

Настраиваем и оптимизируем работу SSD-накопителя в Windows и Ubuntu

Разбираемся, какие службы и команды нужно отключить, чтобы продлить срок службы SSD-накопителя. Спойлер: рядовому пользователю ничего делать не нужно.
 

Большая часть рекомендаций по оптимизации работы и продлении жизни SSD-накопителя сводится к уменьшению количества записи и перезаписи. В этой статье разберемся, какие службы ОС нужно включить или отключить, чтобы продлить жизнь накопителя, а какие нет смысла трогать и лучше оставить работать в конфигурации по умолчанию.

Команда TRIM

Память твердотельного накопителя состоит из блоков, а блоки состоят из страниц. Чтобы обновить информацию в странице, нужно стереть весь блок целиком и только потом записать новые данные. Операция удаления не удаляет данные физически, а только помечает их для удаления. При перезаписи блока добавляется дополнительная операция очистки, из-за которой падает скорость операции. Команда TRIM очищает блоки в фоновом режиме, чтобы наготове всегда были свободные и скорость записи оставалась максимальной.

Чтобы определить состояние TRIM в Windows введем в консоли:

 
 
fsutil behavior query DisableDeleteNotify

DisableDeleteNotify = 1 – TRIM отключен

DisableDeleteNotify = 0 – TRIM включен

Рис. 1. Определение состояния службы TRIM в Windows
Рис. 1. Определение состояния службы TRIM в Windows

Для включения TRIM введем в командной строке:

fsutil behavior set DisableDeleteNotify 0

Для выключения TRIM:

fsutil behavior set DisableDeleteNotify 1

Проверим, включена ли команда TRIM в Ubuntu следующей командой:

lsblk -D

Если у столбцов DISC-GRANи DISC-MAX нулевые значения, то TRIM выключен.

Рис. 2. Определение состояния службы TRIM в Ubuntu
Рис. 2. Определение состояния службы TRIM в Ubuntu

Чтобы запустить TRIM вручную, введем в терминале команду:

sudo fstrim -v /

Служба SysMain

Служба SysMain (Windows 10) в предыдущих версиях Windows называлась Superfetch. Когда ОЗУ недостаточно, SysMain не записывает данные в файл подкачки, а сжимает их в ОЗУ. Также служба объединяет страницы с одинаковым содержимым. Получаем снижение объема записи на диск. Отключать нет смысла.

Как проверить состояние SysMain:

  1. В меню Пуск введем Службы.
  2. Найдем службу SysMain и запустим или остановим ее.
Рис. 3. Включение/выключение службы Superfetch (SysMain) в Windows
Рис. 3. Включение/выключение службы Superfetch (SysMain) в Windows

Служба Prefetcher

8 лучших GUI клиентов PostgreSQL в 2021 году

Что такое графический интерфейс PostgreSQL? Зачем он нужен? Как это может помочь вам в управлении базами данных? Узнайте о лучшем программном обеспечении Postgre GUI, которое можно попробовать в 2021 году.
 

Перевод публикуется с сокращениями, автор оригинальной статьи Ilon Adams.

PostgreSQL – это передовая открытая система управления объектно-реляционными базами данных. В основном она используется на предприятиях и поддерживает запросы SQL и JSON.

По данным Stack Overflow, PostgreSQL является второй наиболее используемой СУБД после MySQL в 2021 году. Более 40% из 70 000+ опрошенных предпочитают Postgres базам данных SQLite, MongoDB, Redis и другим.

У пользователя, есть два способа администрирования СУБД:

 
 
  • писать запросы через CLI (не всем это нравится);
  • использовать графический пользовательский интерфейс (GUI) Postgres.

Второй вариант намного удобнее, т. к. он позволяет повысить производительность. Давайте рассмотрим наиболее используемые инструменты GUI.

Что такое GUI PostgreSQL?

Графический интерфейс PostgreSQL – это инструмент управления базами данных PostgreSQL. Он позволяет любому пользователю запрашивать и визуализировать данные, а также манипулировать данными и анализировать их. Вы можете получать доступ к серверам баз данных и перемещаться по ним с помощью графического интерфейса.

Основные причины, по которым пользователи предпочитают графический интерфейс:

  • длинная кривая обучения работе с CLI и сложная адаптация;
  • не очень приятный в использовании интерфейс командной строки;
  • недостаток информации, которую консоль предоставляет за один раз;
  • трудности при просмотре и мониторинге базы данных с помощью консоли.

Использование GUI дает следующие преимущества:

  • ярлыки, которые можно использовать для быстрого доступа к данным;
  • широкие возможности визуализации данных;
  • удаленный доступ к серверу;
  • легкий доступ к операционной системе.

Лучшее программное обеспечение с графическим интерфейсом

Вероятно для кого-то будет неожиданностью, что ориентированное на Postgres приложение pgAdmin не является единственным доступным инструментом.

Прежде всего есть низкоуровневый конструктор внутренних инструментов UI Bakery. Изначально он не был создан для управления Postgres, однако с его помощью вы можете подключить несколько источников данных (базы данных, сторонние приложения, REST API) в одном UI. Bakery обладает широкими возможностями визуализации данных для отображения PostgreSQL, MongoDB, MySQL, Microsoft SQL, Redis и т.д.

Поскольку UI Bakery ориентирован на веб, не нужно тратить время на его установку и настройку. Вы можете создать графический интерфейс для своей базы, используя ряд готовых компонентов: таблицы, диаграммы, графики, карты, кнопки, выпадающие списки и т.д. Этот процесс занимает минуты или часы вместо недель ручного кодинга.

Подход с низкоуровневым кодом к управлению базами данных гораздо более экономичен и гибок, чем использование традиционных графических инструментов. Тем не менее, давайте рассмотрим и другие продукты.

1. pgAdmin

pgAdmin – кроссплатформенный графический инструмент с открытым исходным кодом.

Плюсы:

  • совместим с Linux, Windows, macOS;
  • позволяет работать с несколькими серверами одновременно;
  • экспорт в CSV;
  • планирование запросов;
  • возможность отслеживать ваши сеансы, блокировки БД с помощью панели мониторинга;
  • ярлыки в редакторе SQL для более удобной работы;
  • встроенный отладчик процедурного языка;
  • тщательная документация и активное сообщество.

Минусы:

  • медленный и не всегда интуитивно понятный пользовательский интерфейс по сравнению с платными конкурентами;
  • тяжелый;
  • высокий порог вхождения;
  • для работы с несколькими базами данных одновременно потребуются продвинутые навыки.

2. DBeaver

DBeaver – инструмент управления PostgreSQL с открытым исходным кодом, поддерживающий коннект к нескольким базам данных.

Плюсы:

  • кроссплатформенность;
  • поддержка более 80 баз данных;
  • визуальный конструктор, позволяющий добавлять запросы без навыков работы с SQL;
  • несколько представлений данных;
  • импорт/экспорт данных в CSV, HTML, XML, JSON, XLS, XLSX;
  • повышенная безопасность данных;
  • полнотекстовый поиск данных и возможность отображения результатов в виде таблиц/представлений;
  • доступен бесплатный тарифный план.

Минусы:

  • низкая производительность по сравнению с конкурентами;
  • слишком частые обновления, что раздражает;
  • после некоторого времени бездействия DBeaver отключается от базы данных.

3. Navicat

Интуитивно понятный (с недавнего времени проприетарный) GUI для Postgres.

Плюсы:

  • простая и быстрая установка;
  • поддержка Windows, Linux, iOS;
  • удобный визуальный конструктор SQL;
  • автодополнение кода;
  • инструмент моделирования данных: управление объектами базы данных, схемами проектирования;
  • планировщик заданий: запускайте задания, получайте уведомления о завершении задания;
  • синхронизация источников данных;
  • импорт/экспорт данных в Excel, Access, CSV и другие форматы;
  • защита данных с помощью SSH и SSL;
  • использование облачных сервисов Amazon, Google и др.

Минусы:

  • низкая производительность GUI;
  • высокая цена по сравнению с конкурентами;
  • одна лицензия ограничена одной платформой (вам понадобятся 2 отдельные лицензии для PostgreSQL и MySQL);
  • множество дополнительных возможностей, требующих времени для изучения.

Navicat

4. DataGrip

Продвинутая IDE для работы с несколькими базами данных, созданная в JetBrains.

Плюсы:

  • кроссплатформенность (поддержка Windows, macOS, Linux);
  • простая навигация по схеме;
  • настраиваемый UI с консолью для обеспечения безопасности выполняемой работы;
  • быстрое обнаружение ошибок;
  • встроенная система контроля версий;
  • поддержка MySQL, SQLite, MariaDB, Cassandra и других;
  • отчеты с возможностью их интеграции с диаграммами и графиками;
  • автодополнение кода.

Минусы:

  • высокая цена;
  • высокое потребление оперативной памяти;
  • сложный процесс отладки ошибок;
  • длинная кривая обучения;
  • не предназначен для использования в качестве облачного веб-приложения;
  • не подходит для одновременного управления несколькими базами данных.

DataGrip

5. HeidiSQL

Инструмент с GUI и открытым исходным кодом для Postgres (и не только). Пока поддерживается только Windows.

Плюсы:

  • простая установка, легковесная по сравнению с конкурентами;
  • поддержка PostgreSQL, MySQL, Microsoft SQL Server, MariaDB;
  • возможность подключения и управления несколькими серверами баз данных в одном окне;
  • прямой экспорт SQL из одной базы данных в другую;
  • массовый просмотр и редактирование таблиц;
  • автодополнение кода и подсветка синтаксиса;
  • сообщество с активной поддержкой и регулярные обновы;
  • экспорт таблиц и данных в Excel, HTML, JSON, PHP;
  • зашифрованное соединение.

Минусы:

  • не кроссплатформенное приложение;
  • частые проблемы со стабильностью;
  • нет отладчика процедурного языка.

HeidiSql

6. TablePlus

Программное обеспечение с графическим интерфейсом для управления базами данных SQL и NoSQL. С закрытым исходным кодом.

Плюсы:

  • высокая производительность;
  • настраиваемый UI;
  • подсветка синтаксиса;
  • высокий уровень безопасности данных обеспечивается за счет сквозного шифрования в соединении.

Минусы:

  • часто возникают проблемы с UX при работе с другими базами данных, кроме PostgreSQL;
  • недешево, а пробная версия предлагает ограниченную функциональность;
  • поддержка клиентов оставляет желать лучшего.

TablePlus

7. OmniDB

Простой открытый инструмент с GUI для PostgreSQL.

Плюсы:

  • кроссплатформенность (поддержка Windows, Linux, macOS);
  • поддержка PostgreSQL, Oracle, MySQL, MariaDB;
  • очень отзывчивый и легкий по сравнению с некоторыми альтернативами;
  • автозаполнение SQL;
  • подсветка синтаксиса;
  • возможность создания настраиваемых диаграммы для отображения релевантных метрик БД;
  • встроенная отладка.

Минусы:

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

OmniDB

Заключение: UI Bakery – неочевидный, но мощный вариант

Когда вы выбираете программное обеспечение с GUI, основывайте окончательное решение на нескольких аспектах:

  • размер команды;
  • используемые ОС;
  • тип СУБД;
  • количество баз данных, с которыми вы планируете работать.

DBeaver, DataGrip и HeidiSQL больше подходят для одного человека, работающего с одной базой. Navicat – выбор для команды благодаря возможности совместной работы. Почти все упомянутые инструменты являются кроссплатформенными за исключением HeidiSQL, который поддерживает только Windows.

Низкоуровневая UI Bakery отлично подходит, если вам нужно объединить несколько различных источников данных – будь то базы данных, сторонние инструменты или API.

Похоже, что pgAdmin и другое классическое ПО теряет популярность. Низкоуровневый подход к управлению базами данных позволяет получать гораздо лучшие результаты за меньшее время.

ИСТОЧНИК

Компания Google не локализовала данные российских граждан на территории России

30 июня Роскомнадзор составил административный протокол в отношении Google LLC по ч. 8 ст. 13.11 КоАП РФ. Руководство американской компании не смогло подтвердить факт локализации баз данных российских пользователей на территории России.

В апреле Роскомнадзор потребовал от ряда иностранных компаний предоставить документы, подтверждающие, что хранение и обработка персональных данных (ПД) российских пользователей осуществляется на территории РФ. Ведомство ожидает ответа от Facebook и Twitter, после чего будет решаться вопрос о возбуждении административного производства.

Оператор ПД обязан обеспечить запись, систематизацию, накопление, хранение, уточнение (обновление, изменение), извлечение персональных данных граждан РФ с использованием баз данных, находящихся на ее территории (Федеральный закон от 27.06.2006 г. № 152-ФЗ "О персональных данных"). Хранение ПД граждан России на ее территории обеспечивает необходимый уровень их защищённости.

На сегодняшний день хранение персональных данных российских пользователей локализовали порядка 600 представительств в РФ зарубежных компаний.

Отсутствие подтверждения факта локализации баз данных российских граждан на территории РФ влечет наложение административного штрафа на граждан в размере от 30 тыс. до 50 тыс. рублей; на должностных лиц - от 100 тыс. до 200 тыс. рублей; на юридических лиц - от 1 млн до 6 млн рублей (ч. 8 ст. 13.11 КоАП РФ).

Основы работы web и сетей передачи данных: вводный видеокурс

Видеоуроки Кирилла Антонова об устройстве, организации и работе сетей передачи данных: от теоретических моделей до практического обмена информацией.

Основы работы web и сетей передачи данных

Достоинства курса:

  • полезные и актуальные сведения без воды;
  • простая подача информации по достаточно сложной теме, курс рассчитан на людей, незнакомых с сетями и протоколами передачи данных;
  • большое развернутое введение в тему.

Недостатки курса:

  • курс не завершен;
  • суховатый стиль изложения;
  • лучше смотреть на скорости 1.5.

Налаживаем отладку или улучшаем свой скилл дебаггинга

Все пишут код, который в какой-то момент крашится. Важно учиться на ошибках и не допускать их. Разбираемся, как улучшить скилл дебаггинга. 

Проблема с логами

log-trouble

Самый неприятный сценарий при падении программы – отсутствие ошибок в логе. И что с этим делать? Особенно если код чужой, и сам черт в нем ногу сломит. 

Первый шаг – определить, сбой происходит во время старта или в рантайме. Это можно сделать, распечатав в консоли что-либо произвольное из разных участков кода.

Если вы не видите сообщения журнала, программа, скорее всего, аварийно завершается при старте из-за проблем со сборкой или зависимостями.

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

Учимся читать сообщения об ошибках

Эксепшены, связанные с фронтэндом, обычно отображаются в UI или консоли разработчика. Иногда эти сообщения видны на сервере – в терминале или в логах. Независимо от того, где происходят эти ошибки, новички слишком растеряны из-за сбоя, чтобы смотреть в логи.

Это основная причина того, почему отладка занимает много времени у большинства разработчиков. Уделяйте особое внимание ошибкам и логам, читайте их внимательно погружаясь в каждую строку сообщения.

Учимся читать системные логи

Некоторые программы создают файлы журнала или ведут записи в журнал системных событий. В этих журналах часто содержится полезная информация. Даже если запись не указывает на конкретное место сбоя, там может быть предупреждение или сообщение об ошибке, предоставляющее подсказку о том, что произошло до возникновения ошибки.

Трассировка и скилл дебаггинга

tracing

Трассировка – это отслеживание потока данных программы. Написание "трассирующих блоков" во всех функционально важных кусках кода помогает упростить процесс дебага. Данный тип логгирования облегчает отслеживание выполнения программы во время работы приложения.

Вносите инкрементальные изменения

Многие программисты создают много кода перед сборкой и тестированием. В таком количестве кода время поиска ошибок увеличивается пропорционально его количеству. Вы должны стремиться вносить инкрементные (малые, ступенчатые) изменения и тестировать их как можно чаще. Это гарантирует, что вы не окажетесь в ситуации, когда ваша программа не работает, а вы даже не знаете, почему.

Применяйте автоматизированное тестирование

Модульные тесты сильно помогают обнаружить большое количество ошибок. Чаще всего работающий код ломается после рефакторинга при низком тестовом покрытии, что свидетельствует об отсутствии автоматического тестирования.

Использование метода исключения

Если не удается определить основную причину проблемы, необходимо использовать метод исключения. Закомментируйте новые блоки кода, чтобы увидеть, прекратятся ли ошибки. Такой подход к диагностике кода поможет приблизиться к источнику проблемы.

Избегайте копипаста

скилл дебаггинга

Часто разработчики бездумно используют код из интернета, не понимая, что он делает. Это плохая привычка. Важно обращать внимание на то, что происходит в вашем приложении.

Когда задаете вопрос на StackOverflow или других ресурсах, пытайтесь качественно сформулировать его, и в конечном счете ответ сам придет.

Если у вас есть команда, используйте метод "второй пары ушей" – разговаривайте с коллегами и ответ не заставит себя долго ждать. Это подстегивает задуматься над решением.

Многократное повторение

Считается, что один из самых успешных методов отладки – это снова и снова пытаться повторно реализовать определенный функционал с нуля. Это заставляет вас находить потенциальные проблемы, воссоздавая реализацию.

Учимся отслеживать события

Если вы изолируете симптомы сбоя в определенной области, можно начать подниматься по стеку вызовов для проверки всех переменных и ожидаемых значений. Это может быстро привести к обнаружению частей программы, в которых происходит непредвиденное поведение.

Научитесь пользоваться отладчиком

Лучший вклад в скилл дебаггинга, который вы можете внести, – это научиться пользоваться отладчиком. Все IDE поставляются с мощными отладчиками. Они позволяют остановить выполнение приложения при запуске или в любой другой части кода. Есть также масса сторонних инструментов для отладки, если по каким-то причинам встроенный вам не нравится.

ИСТОЧНИК

Реляционные базы данных и как с ними оптимально работать

Реляционные базы данных отлично подходят для задач любой сложности, поэтому важно знать, как получить от них максимальную отдачу. Давайте разбираться.
MySQL – популярный выбор для малых и крупных корпоративных компаний благодаря его способности к масштабированию. Следом за ним по популярности идет SQL Server и PostgreSQL.

use databases

Начнем с основ хранения данных в реляционной базе данных.

Понимание реляционных БД

Хранение

MySQL является реляционной базой данных, где все данные представлены в виде кортежей, сгруппированных в отношения. Кортеж представлен его атрибутами.

relation

Допустим, у нас есть приложение, где люди могут одалживать книги. Нам нужно будет хранить все операции над книгами. Для их хранения мы создали простейшую реляционную таблицу при помощи следующей команды:

CREATE TABLE book_transactions ( id INTEGER NOT NULL   AUTO_INCREMENT, book_id INTEGER, 
         borrower_id INTEGER, lender_id INTEGER, return_date DATE, PRIMARY KEY (id));

Таблица выглядит так:

book_transactions
------------------------------------------------
id  borrower_id  lender_id  book_id  return_date

Здесь id – это первичный ключ, а borrower_id, lender_id, book_id – внешние ключи. После того, как наше приложение запускается, в таблице создается несколько записей:

book_transactions
------------------------------------------------
id  borrower_id  lender_id  book_id  return_date
------------------------------------------------
1   1            1          1        2018-01-13
2   2            3          2        2018-01-13
3   1            2          1        2018-01-13

Выборка данных

У нас есть личный кабинет для каждого пользователя, где он может видеть перемещение своих книг. Давайте выберем транзакции книг пользователя:

SELECT * FROM book_transactions WHERE borrower_id = 1;
book_transactions
------------------------------------------------
id  borrower_id  lender_id  book_id  return_date
------------------------------------------------
1   1            1          1        2018-01-13
2   1            2          1        2018-01-13

Эта команда последовательно просматривает строки и возвращает данные пользователя. Процесс происходит очень быстро, т. к. в нашем отношении очень мало данных. Чтобы увидеть точное время выполнения запроса, установите set profiling = 1:

set profiling=1;

После того как значение true установлено, выполните запрос еще раз при помощи следующей команды для просмотра времени выполнения:

show profiles;

Это вернет длительность выполненного запроса:

Query_ID | Duration   | Query
       1 | 0.00254000 | SELECT * FROM book_transactions ...

Таблица book_transactions будет заполняться данными в процессе появления новых транзакций.

Проблема

Это увеличивает количество кортежей в нашем отношении. При этом время, необходимое для извлечения транзакций книги для пользователя, начнет увеличиваться, ведь MySQL должен перебрать все кортежи, чтобы найти результат.

Для заполнения таблицы большим количеством данных, используем следующую процедуру:

DELIMITER //
 CREATE PROCEDURE InsertALot()
   BEGIN
   DECLARE i INT DEFAULT 1;
   WHILE (i <= 100000) DO
    INSERT INTO book_transactions (borrower_id, lender_id, book_id,   return_date) 
              VALUES ((FLOOR(1 + RAND() * 60)), (FLOOR(1 + RAND() * 60)), 
              (FLOOR(1 + RAND() * 60)), CURDATE());
    SET i = i+1;
   END WHILE;
 END //
 DELIMITER ;

Она вставит 100 000 случайных записей в таблицу book_transactions. После выполнения наблюдаем небольшое увеличение времени выполнения:

Query_ID | Duration   | Query
       1 | 0.07151000 | SELECT * FROM book_transactions ...

Давайте добавим еще несколько записей, выполнив описанную выше процедуру, и посмотрим, что произойдет. Чем больше данных будет добавляться, тем больше становится продолжительность запроса. Чтобы выполнить тот же запрос в таблице с 1,5 млн. записей, затрачивается еще больше времени:

Query_ID | Duration   | Query
       1 | 0.36795200 | SELECT * FROM book_transactions ...
Реляционные базы данных со сложными запросами страдают от времени выполнения.

Кажется, что это неплохо для одного запроса, но когда в системе происходят тысячи или даже миллионы запросов, выполняющиеся каждую минуту, это имеет большое значение. Увеличение времени ожидания будет влиять на общую производительность приложения.

Давайте вернем скорость

Index

MySQL и другие реляционные базы данных применяют индексирование структуры данных, помогающее получить выборку быстрее.

Существуют различные типы индексирования в MySQL:

  • Primary Key – индекс на первичный ключ. По умолчанию первичные ключи всегда индексируются. Это гарантирует, что две строки не будут иметь первичный ключ.
  • Unique – уникальный ключ обеспечит отсутствие одинаковых значений у нескольких записей. Несмотря на это, несколько значений Null могут храниться с уникальным индексом.
  • Index – добавляется к любым другим полям, кроме первичного ключа.
  • Full Text – помогает работать с текстовыми данными.

Существует еще два способа хранения индекса:

  • Hash – используется в основном для точного соответствия ( = ) и не работает со сравнениями (≥, ≤)
  • B-tree – это наиболее распространенный способ хранения данных, обеспечивающий эффективную работу с дисковой памятью.

MySQL использует B-tree по умолчанию. Данные хранятся в двоичном дереве, что делает извлечение данных очень быстрым.

b-tree

Структурирование данных, при помощи B-дерева, помогает избежать полного сканирования таблицы со всеми кортежами.

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

CREATE INDEX lenderId ON book_transactions(lender_id)

Эта команда добавляет индекс в поле lender_id. Давайте посмотрим, как это влияет на производительность при обработке 1,5 млн. записей. Запустим тот же запрос еще раз:

SELECT * FROM book_transactions WHERE lender_id = 1;
Query_ID | Duration   | Query
       1 | 0.00787600 | SELECT * FROM book_transactions ...

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

Реляционные базы данных и их индексы

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

Если в запросе участвует несколько полей, можно применить составной индекс. Это следует делать так:

CREATE INDEX lenderReturnDate ON book_transactions(lender_id, return_date);

Другое применение индексов

Запросы – это не единственное направление использования индексов. Они также могут быть использованы в условиях ORDER BY. Давайте отсортируем записи относительно lender_id:

SELECT * FROM book_transactions ORDER BY lender_id;
1517185 rows in set (4.08 sec)

Результат неутешительный. Что пошло не так при условии, что мы установили индекс? Попробуем углубиться в реляционные базы данных, чтобы разобраться с  функцией EXPLAIN.

Использование Explain

Добавим Explain, чтобы увидеть, как запрос будет выполняться в нашем текущем наборе данных:

EXPLAIN SELECT * FROM book_transactions ORDER BY lender_id;

Вывод команды:

Реляционные базы данных

Существуют различные поля, возвращаемые Explain-ом. Заглянем в таблицу выше и выясним проблему.

  • rows: общее количество строк, которые будут проверяться.
  • filtered: процент строк, которые будут проверяться для получения данных.
  • type: указывается, если используется индекс. ALL означает, что индекс не используется.
  • possible_keys, key, key_len: NULL, что означает, что никакой индекс не используется.

Так почему же запрос не использует индекс?

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

Индекс содержит сведения только об индексируемых полях. Это означает, что MySQL снова должен будет обратиться к главной таблице для выборки данных. Для этого нужно немного переписать запрос.

Выборка только необходимого поля

Чтобы убрать необходимость перехода к основной таблице для запроса, нам нужно выбрать только то значение, которое присутствует в индексной таблице:

SELECT lender_id FROM book_transactions ORDER BY lender_id;

Это вернет результат за 0,46 секунды, что намного быстрее. Но показатель можно еще улучшить.

Поскольку этот запрос выполняется для всех 1,5 млн. записей, он выполняется немного дольше, поскольку ему необходимо загрузить данные в память.

Используем Limit

Нам не нужны все записи одновременно, и мы можем использовать оператор LIMIT для упрощения выборки:

SELECT lender_id
  FROM book_transactions
  ORDER BY lender_id LIMIT 1000;

С применением Limit, время ответа существенно улучшилось: 0,0025 секунды. Теперь мы можем получить следующую партию с применением OFFSET:

SELECT lender_id
  FROM book_transactions
  ORDER BY lender_id LIMIT 1000 OFFSET 1000;

Это приведет к выборке 1000 строк. При этом мы можем увеличить offset и limit, чтобы получить все данные. Только есть одно "но": с увеличением offset уменьшается производительность запроса.

Это происходит потому, что MySQL сканирует все данные, чтобы достичь точки смещения. Поэтому лучше не использовать большой offset.

Как насчет Count?

Движок InnoDB имеет способность писать в БД параллельно. Это делает его очень масштабируемым и улучшает пропускную способность в секунду.

Но за это придется заплатить. InnoDB не может добавлять счетчик кэша для записей в любой таблице. Подсчет должен быть произведен в реальном временя путем просмотра всей фильтрованной информации. Это делает COUNT медленным.

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

Почему бы не добавить индекс ко всем полям?

Добавление индекса помогает повысить производительность, но также имеет свои издержки. Его следует использовать эффективно, иначе это приведет к следующим проблемам:

  • Нужен мощный сервер.
  • Когда что-то удаляется, происходит переиндексация (CPU загружен, и процесс удаления медленный).
  • Когда что-то добавляется, происходит переиндексация (CPU загружен, и процесс вставки медленный).

Теперь мы понимаем, что добавление индекса облегчает жизнь, но мы по-прежнему не можем выбрать все данные, кроме тех, которые индексируются для быстрой работы.

Так как же выбрать все атрибуты и при этом не потерять производительность?

Партиционирование

Пока мы строим индексы, у нас есть информация только об индексируемом поле, и нет данных о полях, которых нет в индексе.

Как уже говорилось ранее, MySQL нужно “заглянуть” в главную таблицу, чтобы получить данные о других полях, а это замедлит время выполнения.

Данная проблема решается при помощи партиционирования.

Партиционирование (разбиение) – это метод, в котором MySQL разделяет  большие таблицы на несколько малых, но все еще управляет ими как одной.

При выполнении любой операции с таблицей необходимо указать, какой раздел используется. При партиционировании MySQL будет немного проще, т. к. используется маленький набор данных для запроса. Заранее продуманное разбиение в соответствии с задачей – ключ к высокой производительности.

Если на данном этапе используется один сервер, то будет ли он масштабируемым?

Шардинг

Когда информации очень много, хранить ее на одном сервере затруднительно. Какой-нибудь раздел может быть “крупным”, и запросы к нему будут задерживать параллельные обращения к другим разделам.

Предположим, что данные за последние три месяца используются чаще всего, тогда как более старые – реже. Возможно, последние данные в основном обновляются / создаются, тогда как старые данные только читаются.

Чтобы устранить эту проблему, можно переместить раздел с последними тремя месяцами на другой сервер. Шардинг – это способ разделения большого набора данных на более мелкие блоки и перемещения в отдельные СУБД. Другими словами, шардинг можно назвать “горизонтальным разделением”.

Реляционные базы данных имеют возможность масштабироваться по мере роста приложения, нужно только найти правильный индекс и настроить инфраструктуру в соответствии с потребностями.

ИСТОЧНИК

Яндекс.Метрика Рейтинг@Mail.ru