![](/user_photo/1438_p9ksI.png)
MySQL. Библиотека профессионала - Аткинсон Л
..pdf![](/html/1438/356/html_amDLSm0pjx.n5LJ/htmlconvd-Bqne0F471x1.jpg)
472 Глава 26. Оптимизация
NULL rows: 104237
2 rows in set (0 . 00 sec)
В запросе участвуют три столбца: столбцы word и таблицы word и столбец word таблицы dictionary. Известно, что тестовому условию отбора соответствуют
записей таблицы word, поэтому наша задача состоит в том, чтобы сократить диа пазон сканирования первой таблицы до соответствующего уровня. Для этого необхо димо создать индекс по столбцу class. Сначала я планировал включить в индекс только упомянутый столбец, но потом подумал о других запросах, которые приходит ся направлять таким таблицам. Я, например, часто создаю отчет, в который включа ется все содержимое таблицы, отсортированное сначала по классам, а затем — по сло вам. Разумнее будет включить в индекс сразу два столбца (листинг 26.4).
ALTER TABLE word
ADD INDEX (class, word)
Теперь инструкция EXPLAIN выдает другие результаты (листинг 26.5). В поле key_len сообщается о что индекс охватывает 16 символов столбца class. По оценке программы MySQL, ей придется просмотреть 1517 записей, хотя мы знаем,
mysql> EXPLAIN |
SELECT |
|
|
FROM word LEFT JOIN dictionary |
|
|
ON |
|
|
WHERE |
\G |
table: word |
|
|
type: |
ref |
|
|
class |
|
key: class |
|
|
key_len: |
16 |
|
ref: |
const |
|
rows: |
1517 |
|
Extra: |
where used; |
Using index |
table: dictionary
ALL
NULL key: NULL key_len: NULL ref: NULL
rows: 104237
2 rows in set (0.00 sec)
![](/html/1438/356/html_amDLSm0pjx.n5LJ/htmlconvd-Bqne0F472x1.jpg)
![](/html/1438/356/html_amDLSm0pjx.n5LJ/htmlconvd-Bqne0F473x1.jpg)
474 Глава 26. Оптимизация
значений по умолчанию. Вместо того чтобы указывать значения всех столбцов, задайте лишь те из них, которые отличаются от стандартных установок, а остальное пусть сделает MySQL. Ска занное иллюстрирует листинг 26.8, в котором по казаны определение таблицы и инструкция
CREATE TABLE |
address |
|
|
|
ID |
NOT NULL AUTO_INCREMENT, |
|||
|
|
default |
NULL, |
|
Name_First |
|
default |
NULL, |
|
Name_Middle |
default |
NULL, |
||
Name_Last |
NOT NULL default |
|||
|
|
default |
NULL, |
|
Company |
default |
NULL, |
||
|
default |
NULL, |
||
Street2 |
default |
NULL, |
||
|
default |
NULL, |
||
City |
NOT NULL default |
|||
|
NOT NULL default |
|||
|
NOT NULL default |
|||
|
|
default |
NULL, |
|
|
default |
NULL, |
||
Phone2 |
default |
NULL, |
||
Fax |
default |
NULL, |
|
|
NOT NULL default |
||||
PRIMARY KEY |
|
|
|
|
INSERT INTO |
address |
|
|
|
VALUES |
|
|
|
|
По умолчанию операции записи имеют приоритет над операциями чтения, но программа MySQL не прервет выполнение инструкции SELECT, если в очереди вдруг появится инструкция INSERT. Последняя окажется заблокированной до тех пор, пока инструкция SELECT не завершится. У инструкции INSERT есть также специальный флаг DELAYED, при наличии которого инструкция помещается в очередь без блоки рования клиентского приложения, что повышает его оперативность.
Если есть несколько записей, предназначенных для вставки в таблицу, воспользуй тесь многострочной инструкцией INSERT. Еще быстрее работает инструкция LOAD DATA INFILE. Для полной очистки таблицы лучше вызывать инструкцию TRUNCATE TABLE, а не DELETE. В случае программа MySQL удалит иснова создаст таблич ный файл, вместо того чтобы удалять записи одна за другой.
Если в состав инструкции входит сложное выражение, замените его пользователь ской функцией. Естественно, это имеет смысл делать только тогда, когда предполага ется многократно вызывать инструкцию. О создании собственных функций расска зывается в главе 31, "Расширение возможностей MySQL".
![](/html/1438/356/html_amDLSm0pjx.n5LJ/htmlconvd-Bqne0F474x1.jpg)
Обслуживание таблиц 475
Обслуживание таблиц
Можно ускорить выполнение запросов, если хранить таблицы и индексы в упоря доченном виде. Инструкция TABLE улучшает таблицу тремя способами. Во первых, она устраняет пустые промежутки, оставшиеся после удаления записей. Для таблиц
это означает возможность одновременного выполнения инструкций INSERT и SELECT. Во вторых, она соединяет распределенные фрагменты таблиц с динамическими записями. И наконец, она сортирует индексы.
Инструкция ALTER TABLE позволяет отсортировать записи таблицы. Это тоже собствует ускорению некоторых запросов, хотя и не устраняет потребность в индексах.
Если таблица меняется редко, а дисковое пространство ограничено, имеет смысл сжать таблицу с помощью утилиты (см. главу 14, "Утилиты командной строки"). После этого таблица будет доступна только для чтения. Ее индексы необхо димо перестроить, вызвав утилиту
Данная методика позволяет умень шить размер таблицы на 40 70%, в зависимости от формата ее содержимого. В лис тинге 26.9 показан процесс сжатия таблицы, содержащей названия штатов США.
state
Compressing (50 records)
Calculating statistics
Compressing file
32.42%
Remember to run myisamchk on compressed tables myisamchk rq state
check key
check record delete chain
recovering (with sort) Data records: 50
Fixing index 1
Fixing 2
Настройка конфигурации сервера
Когда речь заходит об объеме оперативной памяти сервера, совет всегда один: чем тем лучше. Увеличение объема памяти способствует ускорению работы программы MySQL, так как в оперативной памяти она хранит свои временные табли цы и буферы записей. В подкаталоге support files дистрибутива содержатся
разцы конфигурационных файлов с различными вариантами настроек, касающихся использования памяти. Выберите тот вариант, который соответствует исходным па раметрам сервера. Поработав с сервером какое то время, можно будет оценить, какие из настроек требуют корректировки.
В листинге 26.10 показана конфигурация сервера, располагающего как минимум 1 Гбайт ОЗУ, четырьмя жесткими дисками и четырьмя центральными процессорами. ратите внимание на важность индексного буфера. В данной конфигурации
ся, что сервер хранит табличные данные на первом диске, а временные файлы — на
ром. Таблицы находятся на третьем диске, а журналы
— на четвертом.
![](/html/1438/356/html_amDLSm0pjx.n5LJ/htmlconvd-Bqne0F475x1.jpg)
476 Глава 26. Оптимизация
set variable |
|
set variable |
|
set variable |
table_cache=512 |
set variable |
|
set variable |
|
set variable |
thread_cache_size=8 |
set variable |
thread_concurrency=8 |
set variable |
|
log bin |
|
server id |
1 |
Таблицы
set variable bdb_cache_size=384M set variable
Таблицы
/disk3/
/disk4/ /disk4/
set variable set variable
set variable innodb_log_file_size=5M set variable
innodb_log_archive=0 set variable
set variable set variable
set variable
Когда сервер проработает какое то время, выполните инструкцию SHOW STATUS, чтобы узнать его производительность. Сравните значения показателей Key_reads и Их соотношение будет очень низким, если программа MySQL часто пользуется индексным буфером. В случае необходимости попытайтесь повы сить размер буфера.
Проследите изменение показателя Open_tables, сравнивая его созначением серверной переменной table_cache, которое можно узнать с помощью инструкции SHOW VARIABLES. Когда табличный буфер заполняется, программа MySQL вынужде на закрывать одни таблицы, чтобы открывать другие. Показатель Opened_tables отражает число таблиц, открывавшихся с момента запуска сервера. Сравните его с общим числом запросов (показатель Questions). Чем больше будет размер таблич ного буфера, тем реже придется открывать и закрывать таблицы.
Серверная переменная thread_cache_size задает размер кэша потоков. Как правило, на каждый процессордолжно приходиться два потока. Сравните показатели и Connections,
определить, как часто серверу приходи
лось повторно использовать потоки.
![](/html/1438/356/html_amDLSm0pjx.n5LJ/htmlconvd-Bqne0F476x1.jpg)
![](/html/1438/356/html_amDLSm0pjx.n5LJ/htmlconvd-Bqne0F477x1.jpg)
478 Глава 26. Оптимизация
В исходные дистрибутивы MySQL входят все необходимые для этого файлы, по этому путь к библиотекам Berkeley DB задается только в том случае, когда требуется использовать их альтернативные версии.
Общая
результаты
файле
Вывести список опций
He создавать выходные файлы
He отображать сообщения
Отобразить номер версии утилиты котораясоздаладанныйсценарий
Имена файлов и каталогов
Помещать архитектурно независимые файлы в каталог префикс (по умолча нию
Помещать архитектурн о зависимые
файлы в каталог |
(по умолча |
нию — префикс) |
|
Помещать пользовательские испол няемые файлы в каталог (по нию —
/bin)
Помещать административные испол няемые файлы в каталог (по умолча нию — префикс
Помещать исполняемые файлы про грамм в каталог (по умолчанию —
Помещать архитектурно независимые данные, доступные только для чтения, в каталог (по умолчанию — префикс/ share)
Помещать системные данные, доступ ные только для чтения, в (по умолчанию — префикс/ etc)
![](/html/1438/356/html_amDLSm0pjx.n5LJ/htmlconvd-Bqne0F478x1.jpg)
Перекомпиляция MySQL 479
Имена и каталогов
Помещать модифицируемые архитек турно независимые данные в каталог (по умолчанию — префикс/ com)
Помещать модифицируемые систем ные данные в каталог (по умолчанию —
Помещать объектные библиотеки в талог (по умолчанию —
Помещать файлы заголовков в каталог (по умолчанию — include)
Помещать файлы заголовков, не предна значенные для компиляторов в
(по
Помещать документацию системы Info в каталог(поумолчанию—
Помещать документацию системы Man в каталог (по умолчанию —
Искать исходные файлы в каталоге (сначала — в каталоге сценария)
Добавлять префикс к именам инсталли рованных программ
Добавлять суффикс к именам инсталли рованных программ
program transform |
Запускать программу для |
|
инсталлированных программ |
зла
Рабочий узел (по умолчанию guessed)
узел)
Свойства и пакеты
Не включать свойство (то же, что
![](/html/1438/356/html_amDLSm0pjx.n5LJ/htmlconvd-Bqne0F479x1.jpg)
![](/html/1438/356/html_amDLSm0pjx.n5LJ/htmlconvd-Bqne0F480x1.jpg)
Перекомпиляция MySQL 481
Дополнительные возможности
Использовать библиотеку
Использовать
Использовать указанную потоковую библиотеку, а не которая автомати чески обнаруживается сценарием
Использовать указанную библиотеку curses, а не ту,которая автоматиче ски обнаруживается сценарием
Использовать указанную библиотеку а не ту, которая автоматически обнаруживается сценарием
Компилировать клиент с поддержкой потоков
Использовать ассемблерные версии некоторых строковых функций, если это возможно
Включить поддержку RAID дисков
Использовать указанный параметр
должен представлять собой абсолютное путевое имя
Использовать заданный порт для висов MySQL (по умолчанию — 3306)
Запускать демон от имени
Отключить поддержку больших файлов
Компилировать программу с поддержкой библиотеки
He включать в программу код отладки
Использовать дополнительные пара метры компоновки демона
Использовать дополнительные пара метры компоновки клиентов