Оптимизация Оптимизация • Если с увеличением объема вашей базы данных она стала работать слишком медленно, зачастую самый простой путь решения этой проблемы – увеличение мощности аппаратной платформы сервера. Однако повысить быстродействие системы можно и без наращивания аппаратных ресурсов, а за счет оптимизации таблиц, запросов, настроек сервера и др. Оптимизация структуры данных Если «узким местом» вашей базы данных является одна или несколько таблиц, попробуем скорректировать структуру этих таблиц: • выбрать наиболее подходящий тип таблицы; • минимизировать объем данных в таблице; • пересмотреть набор индексов в таблице; • указать необходимые значения опциональных параметров. Выбор наиболее подходящего типа таблицы Каждый тип таблиц имеет свои преимущества и недостатки. Если требуется обеспечить высокую производительность операций чтения данных (например, таблица будет использоваться главным образом для анализа содержащихся в ней данных или для генерации динамических веб-страниц), предпочтительным типом такой таблицы является MyISAM. Если же данные в таблице будут редактироваться множеством пользователей (это часто происходит в корпоративных базах данных), желательно присвоить таблице тип InnoDB. Минимизация объема данных Минимизация объема данных позволяет ускорить чтение данных с диска и снизить загруженность оперативной памяти. Перечислим несколько способов минимизации объема данных. • Хранение мультимедийных данных (изображений, аудио– и видеозаписей) не в базе данных, а в файловой системе. Чтение большого файла требует в несколько раз меньше ресурсов, чем получение тех же данных с помощью запроса из столбца с типом BLOB. Поэтому рекомендуется хранить в базе данных не сами мультимедийные файлы, а только пути к ним. Минимизация объема данных • Подбор типов столбцов с наименьшим размером. Например, если значения в целочисленном столбце не могут превышать 10 000, целесообразно объявить его как SMALLINT, а не INT или MEDIUMINT. О • Указание свойства NOT NULL для всех столбцов, для которых это возможно. Если в столбце не предполагается использовать неопределенные значения, задание свойства NOT NULL позволит уменьшить длину каждого значения на 1 бит. Настройка набора индексов Индекс для столбца таблицы позволяет многократно ускорить поиск с условием на значение этого столбца, сортировку (ORDER BY) и группировку (GROUP BY) по значениям столбца, вычисление максимального и минимального значения, а также объединение таблиц. Благодаря наличию индекса выполнение всех этих операций не потребует последовательного перебора всех строк таблицы. Для максимально эффективного использования индексов необходимо учитывать следующие факты. • Индекс замедляет добавление и обновление строк таблицы. Поэтому рекомендуется создавать только те индексы, которые будут использоваться в часто выполняемых запросах. • Для поиска с условиями на значение нескольких столбцов лучше всего подходит многостолбцовый индекс. • Более короткие индексы работают быстрее. Настройка набора индексов При создании индекса для группы столбцов важно правильно выбрать последовательность столбцов в индексе, так как в запросах может применяться часть многостолбцового индекса, состоящая из нескольких начальных столбцов. Например, если в таблицу Orders (Заказы) добавить индекс INDEX (date,product_id,customer_id) то он ускорит выполнение запросов SELECT * FROM Orders WHERE date=CURDATE(); SELECT * FROM Orders WHERE date=CURDATE() AND product_id=3; но будет бесполезен при выполнении запросов SELECT * FROM Orders WHERE product_id=3; SELECT * FROM Orders WHERE product_id=3 AND customer_id=533; Оптимизация запросов Основным способом повышения производительности запросов являются индексы. Определить, действительно ли созданные вами индексы используются запросом, позволяет команда EXPLAIN <Текст запроса>; Набор данных, выводимый командой EXPLAIN, содержит детальную информацию о ходе выполнения запроса. Каждая строка в этом наборе описывает одну из операций, составляющих запрос. Оптимизация запросов EXPLAIN SELECT contract_num, contract_date FROM k_contract WHERE contract_num IN (SELECT k_contract_contract_num FROM k_bill WHERE bill_date BETWEEN '2011-12-01' AND '2011-12-31') Другие способы оптимизации • Исключите получение лишней информации из базы данных. Результат запроса должен содержать только те данные, которые действительно необходимы. • Максимально упростите систему привилегий доступа. Чем сложнее система привилегий, тем больше времени занимает проверка прав доступа при выполнении запросов (и других SQL-команд). • Если запрос содержит выражение, проверьте, не является ли вычисление этого выражения причиной замедления запроса.