Но что же выбрать для наилучшего быстродействия сайтов на 1С-Битрикс?
Проводя тесты и обслуживая различной сложности проекты мы пришли к выводу, что наиболее требователен к базе (генерирует наибольшее количество запросов) модуль "Веб-аналитика" ("Статистика") системы "1С-Битрикс".
[spoiler]
Кроме того данный модуль в процессе взаимодействия с базой не только читает из неё, а также изменяет и удаляет записи. Что создаёт весьма большое количество "мусора".
К примеру, проект с посещаемостью порядка 200 000 уникальных кликов в сутки создаёт порядка 100-200Мб мусора, что как Вы понимаете существенно "тормозит" работу с базой.
Какое решение?
Решение очень простое - использовать InnoDB, который в отличии от MyISAM блокирует только записи (а не всю таблицу) и производит процедуры "сжатия" после каждой операции. Тем самым не образовывает "мусор".
Что же всё-таки представляет собой так называемый "мусор"?
Не будем вдоваться в глубокие технические подробности, представьте себе лист бумаги. Например, Вы написали на нём 3 строки:
Строка 1
Строка 2
Строка 3
А теперь Вам надо убрать строку 2. Как Вы это сделаете наибыстрейшим способом? Правильно, вычеркните её. Теперь у Вас на листе бумаги:
Строка 1
Строка 3
Т.е. строка 2 помечена как удалённой (вычеркнутой), но место на листе бумаги она занимает.
По такому принципу и работает MyISAM, только строки держаться в файле.
Теперь, чтобы строка 2 перестала отсутствовать полностью, надо взять чистый лист бумаги и переписать все строки, которые не зачёркнуты (есть функция оптимизации MyISAM). Но пока Вы не перепишите строки на чистый лист - с базой нельзя работать, т.е. блокировка таблицы функцией оптимизации не даст Вам работать с этой таблицей, пока функция оптимизации не закончит работу (не "перепишет строки базы на новый лист").
В InnoDB использует совершенно другой принцип, принцип работы со строками, а не с таблицами. Т.е. блокируется только строка, да и зачёркнутая строка 2 может быть сверху записана другой строкой.
Если InnoDB не хранит мусора, то почему бы не использовать его везде?
Всё очень просто, тип MyISAM использует принцип "писать в конец файла", а не принцип InnoDB "найти свободную строку и записать, если нет свободной, то в конец файла". Т.е. MyISAM при работе с базой не требуется её постоянный анализ, что существенно ускоряет процесс.
Поэтому MyISAM таблицы быстрее InnoDB.
Так какой тип хранения выбрать?
Самый лучшый тип хранения для таблиц, где нет постоянных изменений - MyISAM. Для таблиц, где постоянно что-то меняется (таблиц модуля "Веб-аналитика") - InnoDB.
Что рекомендуем мы?
Всё зависит от конкретной задачи, но на практике версии 1С-Битрикс без модуля "Веб-аналитика" (Старт, Стандарт, Малый Бизнес) мы храним в MyISAM. Версии же "Эксперт", "Бизнес" и выше храним в InnoDB.
Почему не хранить все таблицы, кроме таблиц статистики в MyISAM, а статистику в InnoDB?
Этот момент исключительно зависит от Ваших технических возможностей (от серверов, где Вы размещаетесь). Просто обратите внимание, что кэши таблиц MyISAM и InnoDB - разные кэши. И разумнее держать все таблицы в одном типе, которому выделять больше кэш-ресурсов, чем 3 типа с "урезанными" кэшами.
И на последок...
Для конвертации базы данных системы 1С-Битрикс достаточно воспользоваться скриптом:
<? require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php"); $res=$DB->Query("SHOW TABLES LIKE 'b_%'"); while ($f=$res->Fetch()) { $v=each($f); $Query = "ALTER TABLE ".$v[1]." ENGINE=INNODB"; if ($DB->Query($Query,true)) echo $v[1]." <font color=green>OK</font><br>"; else echo $v[1]." <font color=red>Ошибка!</font><br>"; } require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php"); ?> |
Данный скрипт достаточно сохранить в корень сайта, например в файл convert.php и запустить из браузера, например, http://ваш_сайт/convert.php .
Если конвертация пройдёт успешно, то Вы увидете список таблиц, а справа от них зеленый ОК.
Кстати, не забудьте после этого сообщить 1С-Битрикс, что у Вас тип таблиц теперь InnoDB.
Делается это путём добавления строки
define("MYSQL_TABLE_TYPE", "INNODB"); |
в файл /bitrix/php_interface/dbconn.php (в любое место файла в отдельной строке).