Оптимизация - Кафедра анализа данных и исследования

advertisement
Оптимизация
Оптимизация
• Если с увеличением объема вашей базы данных она стала
работать слишком медленно, зачастую самый простой
путь решения этой проблемы – увеличение мощности
аппаратной платформы сервера. Однако повысить
быстродействие системы можно и без наращивания
аппаратных ресурсов, а за счет оптимизации таблиц,
запросов, настроек сервера и др.
Оптимизация структуры данных
Если «узким местом» вашей базы данных является одна или
несколько таблиц, попробуем скорректировать структуру
этих таблиц:
• выбрать наиболее подходящий тип таблицы;
• минимизировать объем данных в таблице;
• пересмотреть набор индексов в таблице;
• указать необходимые значения опциональных параметров.
Выбор наиболее подходящего типа таблицы
Каждый тип таблиц имеет свои преимущества и недостатки.
Если требуется обеспечить высокую производительность
операций чтения данных (например, таблица будет
использоваться главным образом для анализа
содержащихся в ней данных или для генерации
динамических веб-страниц), предпочтительным типом
такой таблицы является 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-команд).
• Если запрос содержит выражение, проверьте, не
является ли вычисление этого выражения причиной
замедления запроса.
Download