Оптимизация базы данных MYSQL с использованием индексации

Я работаю над LearnBiz Simulations , самофинансируемым стартапом, который делает моделирование для области управления образованием.

(а) Наш сайт в настоящее время обслуживает около 16 тыс. человек. В настоящее время размер базы данных составляет 30 мб, в общей сложности около 90 таблиц, и каждая таблица может содержать от 5 до 50 столбцов. Все наши таблицы в базе данных неоднократно имеют новые строки вложений, удалений или обновлений. Но столбцы никогда не добавляются. Создает ли он какие-либо проблемы с использованием методов индексирования? Были еще несколько форумов и видеороликов, которые предполагают, что даже вставка или удаление строки сделает индексирование бесполезным!

(б) Максимальная работа на нашем веб-сайте – это запросы mysql с некоторой обработкой строк кода в диапазоне от 200-800 строк. Почти 95% + наших запросов имеют множественное равенство where where, чтобы выровнять требуемую строку. Если я правильно понимаю, то использование индексации поможет нам ускорить процесс в несколько раз быстрее?

(c) Существуют некоторые модели, которые обрабатывают данные многих участников каждую минуту. Для такого моделирования в настоящее время мы не можем обслуживать даже 50 участников одновременно. Будет ли использование индексации помогать таким симуляторам иметь гораздо больше пользователей?

(d) Сервер, на котором мы сейчас находимся, является VDS с GoDaddy (стоит около 400 долларов США в год). Чтобы ускорить работу нашего сайта, было бы целесообразно перейти на DDS (стоимостью около 3000 долларов в год) или получить что-то вроде TokuDB? Есть ли способ судить о емкости пользователя текущей системы, то есть сервер + база данных + кодирование?

(a) Эти форумы и видео бесполезны, бездумно повторяют полуправды (да, при использовании индексов есть накладные расходы, просто выигрыш в производительности обычно превышает его много раз)

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

(c) Убедитесь, что ваш тест не моделирует слишком большой трафик. Например, 50 реальных пользователей одновременно не будут генерировать 50 подключений в секунду. Опять же, вы должны увеличить производительность после внедрения индексов и оптимизации ваших запросов

(d) Никаких дополнительных ресурсов не поможет, если ваш сервер базы данных не настроен должным образом (вы используете кеш запросов? Вы разрешаете MySQL использовать достаточное количество памяти для хранения таблиц в памяти? и т. д.).

Подводя итог: прочитайте о базовой конфигурации вашего сервера MySQL, чтобы он мог эффективно использовать ваши ресурсы (по умолчанию обычно недостаточно), а также посмотрите главу «Оптимизация» в руководстве.

Что касается вопросов с индексами, индекс не только желателен, но и необходим для «ускорения» вещей. Насколько я понимаю (в терминах «непрофессионала»), функция индекса заключается в ускорении поиска и восстановления данных внутри таблицы.

Причины использования индексов:

  1. Уникально идентифицируйте каждую строку в каждой таблице (первичный ключ – это индекс, в конце концов)
  2. Индексы сортируются (даже если данные отсутствуют)
  3. Ускорьте поиск и фильтры: индекс делает восстановление данных быстрее, поскольку оно «удерживает» размещение данных в таблице (оно «точно определяет» данные, которые вы хотите восстановить). Кроме того, он упрощает механизм базы данных для фильтрации данных (всегда проще и проще фильтровать отсортированные данные, чем скремблированные данные)
  4. Оптимизируйте способ восстановления данных при использовании связанных таблиц: каждый внешний ключ должен быть проиндексирован, чтобы ускорить запросы, связанные с отношениями первичного и внешнего ключей

Некоторые «правила большого пальца», которые я использую, чтобы определить, какие поля нужно индексировать:

  • Каждый первичный ключ индексируется ( очевидный : первичный ключ должен быть уникальным, а не нулевым)
  • Каждый иностранный ключ должен быть проиндексирован (чтобы сделать отношения с первичными – внешними ключами эффективными)
  • Каждое числовое или поле даты, в которое мне нужно выполнить поиск, нужно индексировать. Тем не менее, я стараюсь избегать double (или любых других чисел с числовыми числами с плавающей запятой) для индексирования, поскольку они обычно используются для хранения значений, не предназначенных для поиска.
  • Каждое поле char или varchar на котором мне нужно выполнять поиск, должно быть проиндексировано. Старайтесь избегать индексов в text полях, поскольку они могут содержать в себе очень большие значения.
  • Избегайте индексирования двоичных ( blob ) полей … это не имеет смысла
  • Не поддавайтесь соблазну индексировать все. Не спешите решать, какие поля должны быть проиндексированы и какие поля не должны индексироваться.