Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

MySQL. Библиотека профессионала - Аткинсон Л

..pdf
Скачиваний:
166
Добавлен:
24.05.2014
Размер:
10.41 Mб
Скачать

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)

Оптимизацияинструкций 473

Итак, появление индекса привело к сокращению диапазона сканирования в 15 раз, но инструкция все ее вынуждена просматривать 45 миллионов записей. Осталось еще учесть столбцы word в обеих таблицах. Разберемся сначала с таблицей word.

В процессе объединения таблиц программа MySQL использует не более одного индекса от каждой таблицы. Если появляются варианты, то выбирается индекс с бо

лее узким диапазоном.

нами индекс уже охватывает столбец word, к тому

же, как видно из листинга 26.5, диапазон поиска существенно сузился.

Теперь перейдем к таблице dictionary. Пока что

SELECT вынуждена

сканировать ее целиком. Добавление индекса к столбцу word позволит программе сразу же находить нужную запись (листинг

ALTER TABLE dictionary

ADD INDEX (word)

Эффект этого действия продемонстрирован в листинге 26.7. Как видите, количе ство просматриваемых записей таблицы dictionary сократилось до одной!

EXPLAIN SELECT

FROM word LEFT JOIN dictionary

ON

 

WHERE

\G

table: word type:

class key: class

key_len: 16 ref: const rows: 1517

Extra: where used; Using index

table: dictionary type: ref

word key: word

key_len: 64

ref: 1

Extra: Using index 2 rows in set (0.26 sec)

Оптимизация инструкций

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

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,

 

Email

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".

Обслуживание таблиц 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 Гбайт ОЗУ, четырьмя жесткими дисками и четырьмя центральными процессорами. ратите внимание на важность индексного буфера. В данной конфигурации ся, что сервер хранит табличные данные на первом диске, а временные файлы — на

ром. Таблицы находятся на третьем диске, а журналы — на четвертом.

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, определить, как часто серверу приходи

лось повторно использовать потоки.

Перекомпиляция MySQL 477

Просмотрите еще раз список переменных демона приведенный в гла ве 14, "Утилиты командной строки". Есть много разных буферов и кэшей, увеличение размера которых способно повысить производительность сервера. После изменения конфигурации обязательно проведите повторные замеры.

Перекомпиляция MySQL

Команда разработчиков MySQL прилагает огромные усилия для оптимизации ис полняемых файлов программы. Лучше всего пользоваться бинарными дистрибутивами, которые доступны на MySQL. Вряд ли вам удастся получить более качествен ный исполняемый файл. Например, в дистрибутивы Linux зачастую включаются неста бильные версии компиляторов и библиотек. Разработчики MySQL всегда применяют самые стабильные версии в сочетании с оптимальными опциями компиляции.

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

На Web узле MySQL приведена информация о том, как компилировать программу на различных платформах. Не поленитесь просмотреть рекомендации поскольку здесь есть много "подводных камней", особенно в случае старых операци онных систем.

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

поэтому желательно иметь

утилиты.

Нужен также компилятор языка C++.Вполне подойдет какая нибудь

включая

He забудьте и об утилите make.

Те, кто имеют опыт компиляции программ с открытыми кодами, должны быть

знакомы со сценариями конфигурации, создаваемыми утилитой

Саму ее

запускать не нужно. Файл создается сценарием

В листин

ге показан вызов этого сценария с установками, которые рекомендованы разра

ботчиками MySQL. Сценарий

должен запускаться из каталога, содержа

щего исходные коды программы.

 

CXX=gcc \

\

\

\

В табл. 26.1 перечислены параметры сценария Аналогичную мацию можно получить, вызвав сценарий с опцией Если нужно включить поддержку таблиц Berkeley DB или не забудьте указать соответствующие

478 Глава 26. Оптимизация

В исходные дистрибутивы MySQL входят все необходимые для этого файлы, по этому путь к библиотекам Berkeley DB задается только в том случае, когда требуется использовать их альтернативные версии.

Общая

результаты файле

Вывести список опций

He создавать выходные файлы

He отображать сообщения

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

Имена файлов и каталогов

Помещать архитектурно независимые файлы в каталог префикс (по умолча нию

Помещать архитектурн о зависимые

файлы в каталог

(по умолча

нию — префикс)

 

Помещать пользовательские испол няемые файлы в каталог (по нию — /bin)

Помещать административные испол няемые файлы в каталог (по умолча нию — префикс

Помещать исполняемые файлы про грамм в каталог (по умолчанию —

Помещать архитектурно независимые данные, доступные только для чтения, в каталог (по умолчанию — префикс/ share)

Помещать системные данные, доступ ные только для чтения, в (по умолчанию — префикс/ etc)

Перекомпиляция MySQL 479

Имена и каталогов

Помещать модифицируемые архитек турно независимые данные в каталог (по умолчанию — префикс/ com)

Помещать модифицируемые систем ные данные в каталог (по умолчанию —

Помещать объектные библиотеки в талог (по умолчанию —

Помещать файлы заголовков в каталог (по умолчанию — include)

Помещать файлы заголовков, не предна значенные для компиляторов в (по

Помещать документацию системы Info в каталог(поумолчанию—

Помещать документацию системы Man в каталог (по умолчанию —

Искать исходные файлы в каталоге (сначала — в каталоге сценария)

Добавлять префикс к именам инсталли рованных программ

Добавлять суффикс к именам инсталли рованных программ

program transform

Запускать программу для

 

инсталлированных программ

зла

Рабочий узел (по умолчанию guessed)

узел)

Свойства и пакеты

Не включать свойство (то же, что

480 Глава 26. Оптимизация

Свойства и пакеты

Включить свойство умолчанию — yes)

Использовать пакет (по умолчанию — yes)

Не использовать пакет (то же, что

Искать включаемые файлы X Window в каталоге

Искать библиотеки X Window в каталоге

Дополнительные возможности

Разрешить правила и зависимости ути литы make, лишние (а ин огда ные) для обычного инсталлятора

Создавать совместно используемые библиотеки

Создавать статические библиотеки

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

Предполагать, что компилятор языка С использует (по умолчанию отключена)

Избегать блокировок (могут помешать параллельной работе потоков компи лятора)

Подключать библиотеку и другие стандартные библиотеки, располо женные в нестандартном каталоге. Изначально эта опция появилась, что бы компилятор мог подключать биб лиотеку версии 2.2, не требуя от пользователей обновлять стандартную библиотеку libc

Добавлять идентификатор сервера в

строку версии

Перекомпиляция MySQL 481

Дополнительные возможности

Использовать библиотеку

Использовать

Использовать указанную потоковую библиотеку, а не которая автомати чески обнаруживается сценарием

Использовать указанную библиотеку curses, а не ту,которая автоматиче ски обнаруживается сценарием

Использовать указанную библиотеку а не ту, которая автоматически обнаруживается сценарием

Компилировать клиент с поддержкой потоков

Использовать ассемблерные версии некоторых строковых функций, если это возможно

Включить поддержку RAID дисков

Использовать указанный параметр должен представлять собой абсолютное путевое имя

Использовать заданный порт для висов MySQL (по умолчанию — 3306)

Запускать демон от имени

Отключить поддержку больших файлов

Компилировать программу с поддержкой библиотеки

He включать в программу код отладки

Использовать дополнительные пара метры компоновки демона

Использовать дополнительные пара метры компоновки клиентов