Об ускорении работы БД MySQL

В общем, был у нас такой интересный заказчик из США, который захотел сделать достаточно крупный проект, и при этом разместить веб-сервер у себя дома 🙂

Да, такое тоже бывает. Ему пришлось самому с диска поставить голый Debian и дать мне root-доступ к нему. Все остальное на нем настроил я. В принципе, все работало ОК.

Но было одно НО! В этом проекте у клиента была база данных компаний США с более, чем 100 миллионами записей в основной таблице. Плюс еще дополнительные связанные таблицы. Вообще, изначально база была стырена из Microsoft SQL server. Поэтому в ней была огромная куча связей, справочников и неподдерживаемых MySQL типов данных. После некоторых мучений нам удалось все-таки ее портировать в MySQL и разработать PHP-движок для управления ей.

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

Для начала пришлось уговорить клиента доставить памяти в сервер 🙂 Ну а потом были долгие-долгие ковыряния с настройками MySQL (хотя их на самом деле намного меньше, чем у того же MS SQL или тем более Oracle).

В итоге удалось добиться отрабатывания поиска за 10-20 секунд. Это БЕЗ ИНДЕКСА. Если кто не знает, MySQL использует индекс только при поиске с начала строки, т.е. если вы задаете поиск по первым буквам текстового поля. Если искать по контексту (т.е. по средней части строки), то простой индекс не используется.

Сейчас уже на самом деле в MySQL есть новый вид индексов, т.н. Full-text индексы для решения подобных задач. Но во времена нашего проекта такого еще не было.

Поэтому наше решение, если вкратце, состояло в том, чтобы заставить MySQL держать всю таблицу в памяти. Для этого и просили клиента расширить ОЗУ сервера.

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

Так что, если есть проблемы со скоростью работы движка, обращайтесь, поможем, чем сможем 😉

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *