Пишите нам

Имя:
Email:

 
 
 

Статьи

Важные особенности, сопровождающие перевод паспорта с нотариальным заверением
Списание компьютерной и другой оргтехники: как это сделать
Коротко о продвижении
Восстановление данных с CD диска
Безопасность при создании сайтов
Виртуальный офис: новый уровень организации бизнеса
Виртуальная АТС Гравител
Акция на антивирус
Обзор iPad 3
Как сделать сайт удобным?
Как купить сумку для нетбука
Методы получения внешних ссылок на сайт
Широкие возможности Skype для Android
Качественные мобильные телефоны
Сайт визитка: особенности хорошего старта
Надувные матрасы от Ламон
WebNames.Ru – десятилетие деятельности в Интернете
Квартира для вашего сайта.
Технологии от BoldSoft
Как добиться успеха в безнадежных проектах
Новый тип навигационной системы при постраничном выводе
Генерация PDF с помощью PHP
PHP и PostgreSQL
Оптимизируем MySQL

Оптимизируем MySQL
Автор W.J. Gilmore

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

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

Также нужно учитывать все опции при компиляции. Скорее всего Вам не потребуются некоторые из опций, используемых по умолчанию, или потребуется изменить некоторые из них.

 

И зная все это как же сделать свой сервер баз данных MySQL очень быстрым? Вот несколько советов:


Все права на публикацию этой статьи принадлежат RusHelp.com

"Используя только лучший компилятор и/или изменив набор опций компиляции можно на 10-30% увеличить производительность Вашего приложения" -- документация MySQL

Использование компилятора pgcc (Pentium GCC)
http://www.gnu.org/software/gcc/gcc.html -- этот компилятор оптимизирован под приложения, которые будут запускаться на Pentium. Использование компилятора pgcc для сборки MySQL увеличит общую производительность на 10%! Вот страница с информацией о PGCC http://www.goof.com/pcg. Конечно, если Ваш сервер не использует процессор Pentium, то этот компилятор не для Вас.

Компилируйте MySQL только с теми языками, которые Вам нужны.
Сейчас MySQL предлагает 24 языка, что дает возможность использовать MySQL по всему миру на разных языках. По умолчанию MySQL устанавливает все эти наборы символов, хотя Вам скорее всего они все не потребуются. Можно отключить все наборы символов, кроме Latin1 таким способом:


%>./configure -with-extra-charsets=none [--other-configuration-options]

Статическая компиляция mysqld
Статическая компиляция mysqld без shared библиотек также может увеличить производительность. MySQL можно скомпилировать статически следующим образом:


%>./configure -with-mysqld-ldflags=-all-static [--other-configuration-options]


Примерная конфигурация
Следующая команда конфигурации обычно используется для увеличения производительности:


%>CFLAGS="-O6 -mpentiumpro -fomit-frame-pointer" CXX=gcc CXXFLAGS="-O6 -mpentiumpro -fomit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local --enable-assembler --with-mysqld-ldflags=-all-static --disable-shared

В данной статье я не буду объяснять, что значат все эти gcc флаги. Все это и многое другое можно прочитать на странице gcc: http://gcc.gnu.org/ . Также можно дать команду "man gcc" в Вашей системе и ознакомиться с набром всех опций.

Настройка сервера
Хотя правильное конфигурирование компиляции очень важно, это только часть того, что можно сделать. Вам наверное будет интересно узнать, что можно конфигурировать многие переменные MySQL, которые играют важную роль в работе сервера. Более того, эти переменные хранятся в конфигурационном файле, и использует при каждой загрузке сервера. Этот файл называется "my.cnf".

Разработчики MySQL постарались и включили в дистрибутив несколько файлов my.cnf которые на Unix обычно находятся в директории /usr/local/mysql/share/mysql/ . Файлы эти называются my-small.cnf, my-medium.cnf, my-large.cnf и my-huge.cnf, размер в названии каждого файла примерно обозначает размер системы, в которой предполагается использовать MySQL. Если у Вас MySQL работает на системе с малым объемом RAM и планируется использовать MySQL только время от времени, тогда нужно взять my-small.cnf, поскольку он "говорит" демону mysqld не занимать много системных ресурсов. Иначе, если Вы планируете создать огромный электронный супер-маркет и используете систему с объемом RAM 2Gb, тогда лучше использовать my-huge.cnf.


Все права на публикацию этой статьи принадлежат RusHelp.com

Чтобы использовать один из этих файлов, нужно сделать копию того экзепляра, который лучше подходит для Вашего сервера и переименовать его в my.cnf. Можно использовать этот файл на трех уровнях:

Глобальном: скопируйте my.cnf в директорию /etc, таким образом все переменные конфигурации приобретут глобальную видимость, и их будут использовать все MySQL сервера на машине.
Локальном: скопируйте его в /директорию/инсталляции/mysql/var, таким образом он будет виден данной конкретной инсталляции MySQL.
Пользовательском: можно ограничить область видимости даже для конретного пользователя, скопировав файл в корневую директорию для данного пользователя.

Така как же установить эти переменные в файле my.cnf? И какие именно переменные? Хотя все переменные относятся к MySQL серверу, каждая из них имеет отношение к конретной компоненте в MySQL. Например, переменная max_connections относится к демону mysqld. Откуда я это знаю? Я выполнил команду:


%>/usr/local/mysql/libexec/mysqld --help

И получил вывод различных опций и переменных, относящихся к mysqld. Вы легко определите переменные, потому что все они находятся под строкой:


Possible variables for option --set-variable (-O) are

Затем можно установить все эти переменные в my.cnf таким образом:


set-variable = max_connections=100

Эта установка сделает число одновременных подключений к MySQL серверу равным 100. Не забудьте добавить директиву set-variable под заголовком [mysqld] в my.cnf. Если все это Вам непонятно, потратьте время на чтение конфигурационного файла.


Типы таблиц
Многие пользователи MySQL могут удивиться узнав, что в MySQL есть 5 разных типов таблиц, а именно: BDB, HEAP, ISAM, MERGE, MyISAM. Тип BDB образует самостоятельную категорию, известную как категория с поддержкой транзакций. Остальныетипы образуют категорию без поддержки транзакций. Сейчас мы расмотрим каждую из них и типы таблиц.


Все права на публикацию этой статьи принадлежат RusHelp.com

Поддержка транзакций

BDB
Таблицы типа BDB (Berkley DB) поддерживают транзакции и были разработаны компанией Sleepycat Software (http://www.sleepycat.com/). Этот тип предлагает функции, давно ожидаемые многими пользователями MySQL. Поддержка транзакций - это очень полезное свойство в любой СУБД, потому что с их помощью можно заставить группу запросов выполняться как единое целое, и отменять их все, если один из них не сможет отработать. Транзакции очень важны, особенно в в банковских приложениях.

Без поддержки транзакций

HEAP
Таблицы типа HEAP - самые быстрые, так как используют хеш-индекс и хранятся в динамической памяти.Очень важно помнить, что есди MySQL или Ваш сервер "упадет", то все данные в этих таблицах будут потеряны.

ISAM
ISAM таблицы использовались MySQL по умолчанию пока не были разработаны таблицы MyISAM.Я бы рекомендовал не использовать данный тип, а работать с MyISAM.

MERGE
Таблицы типа MERGE появились в версии MySQL 3.23.25. Таблица MERGE - это коллекция идентичный таблиц MyISAM, сведенных в одну. Смысл соединения нескольких таблиц в одну состоит в эффективности решения: это может увеличить скорость, поиск в таблице, сохранить место на диске, смотря что Вы хотите сделать.

Таблицы MERGE все еще находятся в стадии beta, но очень скоро их реализация станет стабильной в Mysql..

MyISAM
Это тип таблиц, принимаемый по умолчанию. Использует код ISAM, но с некоторыми полезными добавлениями. Вот причины, почему MyISAM таблицы лучше:

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

    Об остальных преимуществах MyISAM можно прочитать тут:http://www.mysql.com/doc/I/S/ISAM.html

    Указания типа таблицы

    Указывать тип таблицы нужно во время ее создания. В следующем примере я покажу как указать тип HEAP:


    mysql>CREATE TABLE email_addresses TYPE=HEAP ( ->email char(55) NOT NULL, ->name char(30) NOT NULL, ->PRIMARY KEY(email) );
    Таблицы типа BDB требуют большей конфигурации. Обратиться на страницу документации http://www.mysql.com/doc/B/D/BDB_overview.html за полной информацией.

    И еще типы таблиц

    Для того, чтобы сделать администрирование MySQL еще более интересным ;-) следующая версия MySQL 4.0 будет иметь два новых типа Innobase и Gemeni. Пока информации немного, но проверяйте чаще сайт разработчика.


    Все права на публикацию этой статьи принадлежат RusHelp.com

    Конечно же, все это не может дать полное представление о типах таблиц в MySQL. Для более подробной информации необходимо чиать документацию на сайте MySQL: (http://www.mysql.com/).


    И снова оптимизация...
    Хотя мы уже о многом рассказали, но осталось еще больше. Сейчас мы поговорим немного об анализе и оптимизации MySQL таблиц используя встроенные команды MySQL сервера. Начнем с обзора команд анадиза:

    SHOW

    Вам может быть интересно узнать, что увидеть статус работы сервера можно увидеть, выполнив команду:


    mysql>show status;

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

    SHOW может сделать намного больше. Эта команда может также показать информацию о логах, определенных базах, таблицах, индексах, процессах и таблицах пользовательских привилегий. Здесь Вы найдете более полную информацию: http://www.mysql.com/doc/S/H/SHOW.html


    Все права на публикацию этой статьи принадлежат RusHelp.com

    EXPLAIN

    Если поставить EXPLAIN перед SELECT будет выведена информация о том, как будет обрабатываться этот запрос SELECT. Это не только полезно, чтобы определеить нужно ли добавлять индексы к таблице, но также, чтобы определить как выполняется JOIN.

    OPTIMIZE

    Функция OPTIMIZE позволит Вам освободить место и дефрагментировать данные, что очень важно после большого количества UPDATE'ов и DELETE'ов проведенных над таблицей с записями разного размера. Сейчас OPTIMIZE работает только с таблицами типов MyISAM и BDB.

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



    Заключение
    Как Вы наверное догадались на протяжение этой длинной статьи, можно сделать несколько вещей для оптимизации базы данных и MySQL сервера, начиная с его компиляции и на протяжении всего администрирования. Конечно, мы даже не начали еще говорить об эффективности JOIN'ов, разумном использовании основных SQL запросов, "железе". Но может быть в следующей статье! :) Увидимся!


  • Внимание! Любая перепечатка и использование материалов статей на других сайтах только с разрешения RusHelp.com (info@rushelp.com).