Виктор Гольцман - MySQL 5.0. Библиотека программиста стр 55.

Шрифт
Фон

...

Примечание

Проверить, какие форматы были фактически присвоены таблицам, вы можете с помощью команды SHOW TABLE STATUS; Эта команда выводит информацию обо всех таблицах в текущей базе данных. В столбце Row_format вы увидите текущий формат таблицы.

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

6.2. Оптимизация запросов

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

EXPLAIN <Текст запроса>;

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

EXPLAIN SELECT name,address,product_id,qty

FROM Customers, Orders

WHERE Customers.id=customer_id AND date=\'20007-12-12\

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

MySQL 5.0. Библиотека программиста

Столбец table (таблица) содержит имя обрабатываемой таблицы, а столбец select_type (тип запроса) указывает место операции в структуре запроса:

• SIMPLE – простой запрос без вложенных запросов и UNION;

• PRIMARY – первый запрос в UNION или внешний запрос, имеющий вложенные запросы;

• UNION – второй и последующие запросы в объединении UNION;

• DEPENDENT UNION – второй и последующие вложенные запросы в объединении UNION, связанные с внешним запросом (о связанных подзапросах вы узнали в подразделе "Операторы сравнения с результатами вложенного запроса");

• UNION RESULT – операция объединения результатов запросов;

• SUBQUERY – вложенный запрос;

• DEPENDENT SUBQUERY, UNCACHEABLE SUBQUERY – вложенный запрос, связанный с внешним запросом;

• DERIVED – запрос, генерирующий промежуточный результат (такой запрос следует после ключевого слова FROM).

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

Столбец possible_keys (возможные индексы) показывает, какие индексы из числа существующих в таблице программа MySQL могла бы использовать при выполнении запроса. Если этот столбец содержит значение NULL, а вы считаете необходимым ускорить операцию, добавьте в таблицу подходящие индексы (рекомендации по созданию индексов были изложены в предыдущем разделе).

Возможна ситуация, когда нужный индекс существует, но программа MySQL не применяет его, считая по каким-либо причинам, что просматривать таблицу полностью будет эффективнее. Индекс, фактически используемый при выполнении запроса, отображается в столбце key (индекс); если данный столбец содержит значение NULL, значит, программа MySQL не выбрала ни один из доступных индексов. Если вы, тем не менее, считаете, что индекс должен использоваться, выполните следующие действия:

1. Обновите статистику распределения индексов в таблице с помощью команды

ANALYZE TABLE <Имя таблицы>;

2. Повторно выполните команду EXPLAIN. Если и после обновления статистики индекс не начал использоваться, добавьте в текст запроса после имени таблицы параметр FORCE INDEX (<Имя индекса>). Сравните время выполнения запроса с параметром FORCE INDEX и без него и выберите оптимальный вариант.

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

• Исключите получение лишней информации из базы данных. Результат запроса должен содержать только те данные, которые действительно необходимы. Например, если вы отображаете на веб-странице не более 20 товаров, не нужно получать из таблицы Products (Товары) все данные. Вместо этого используйте запросы вида

SELECT <Список столбцов> FROM <Список таблиц>

[WHERE <Условие отбора>]

LIMIT <Количество строк> OFFSET <Сдвиг>;

Так, для получения первой "порции" из 20 товаров выполните запрос

SELECT * FROM Products LIMIT 20 OFFSET 0;

Следующих 20 товаров -

SELECT * FROM Products LIMIT 20 OFFSET 20;

Затем

SELECT * FROM Products LIMIT 20 OFFSET 40;

и т. д.

• Максимально упростите систему привилегий доступа. Чем сложнее система привилегий, тем больше времени занимает проверка прав доступа при выполнении запросов (а также других SQL-команд). Хорошим решением является разграничение доступа на уровне баз данных и отказ от присвоения привилегий доступа к отдельным таблицам и столбцам. В этом случае контроль действий пользователей не требует обращения к таблицам tables_priv и columns_ priv (см. подраздел "Просмотр привилегий").

• Если запрос содержит выражение, проверьте, не является ли вычисление этого выражения причиной замедления запроса. Для этого выполните команду

SELECT BENCHMARK(<Количество повторений>,<Выражение>);

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

SELECT BENCHMARK(10000000,SIN(1));

При использовании процессора с тактовой частотой 1,6 ГГц выполнение этой команды займет приблизительно 1 с. Таким образом, программа MySQL способна производить около 10 млн вычислений синуса в секунду, а значит, функция SIN() не оказывает существенного влияния на скорость запроса. Итак, мы рассмотрели способы оптимизации таблиц и запросов. В следующем разделе вы узнаете о том, как увеличить быстродействие сервера путем настройки системных переменных.

6.3. Параметры работы сервера

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

Узнать текущие значения серверных переменных вы можете с помощью уже знакомой вам команды

SHOW VARIABLES;

Для изменения значения переменной можно использовать команду

SET GLOBAL <Имя переменной>=<Значение>;

однако установленное таким образом значение будет действовать только до момента перезапуска сервера MySQL. Поэтому лучше указать нужные значения переменных непосредственно при запуске сервера MySQL. • Если вы запускаете сервер вручную из командной строки (об этом говорилось в подразделе "Запуск и остановка сервера MySQL из командной строки" главы 1), укажите в команде запуска сервера параметр – <Имя переменной> = <Значение>, например

mysqld-nt –table-cache=256

• Если сервер MySQL был сконфигурирован как сервис Windows и запускается или автоматически, или с помощью панели управления, или с помощью MySQL Administrator (см. подразделы "Запуск и остановка сервера MySQL с помощью MySQL Administrators "Запуск и остановка сервера MySQL с панели управления" главы 1), откройте конфигурационный файл my.ini, находящийся в папке, где установлена программа MySQL, и добавьте параметр <Имя переменной> = <Значение> в раздел [mysqld] (см. рис. 5.9). Сохраните файл my.ini. Новые значения переменных вступят в действие после перезапуска сервера.

...

Примечание

В корневой папке MySQL вы найдете примеры конфигурационных файлов с различными вариантами настроек системных переменных: my-small.ini, my-medium.ini, my-large.ini, my-huge-ini и my-innodb-heavy-4G.ini.

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

В табл. 6.2 перечислены наиболее важные параметры, влияющие на производительность сервера.

Таблица 6.2.

Параметры работы сервера

Виктор Гольцман - MySQL 5.0. Библиотека программиста

Виктор Гольцман - MySQL 5.0. Библиотека программиста

Виктор Гольцман - MySQL 5.0. Библиотека программиста

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

Ваша оценка очень важна

0
Шрифт
Фон

Помогите Вашим друзьям узнать о библиотеке

Скачать книгу

Если нет возможности читать онлайн, скачайте книгу файлом для электронной книжки и читайте офлайн.

fb2.zip txt txt.zip rtf.zip a4.pdf a6.pdf mobi.prc epub