Телефон в Москве:

(495) 788-77-16

в Санкт-Петербурге:

(812) 313-28-51

по России (бесплатно):

8-800-555-11-32

Опыт  говорит  сам  за  себя:

• более 130 реализованных проектов за все время существования компании

• успешное сотрудничество с крупнейшими компаниями российского бизнеса

InnoDB лучше для версий 1С-Битрикс со статистикой

InnoDB лучше для версий 1С-Битрикс со статистикой

Как известно, существует 2 наиболее популярных формата хранения баз данных MySQL - это MyISAM и InnoDB.

Но что же выбрать для наилучшего быстродействия сайтов на 1С-Битрикс?

Проводя тесты и обслуживая различной сложности проекты мы пришли к выводу, что наиболее требователен к базе (генерирует наибольшее количество запросов) модуль "Веб-аналитика" ("Статистика") системы "1С-Битрикс".
[spoiler]
Кроме того данный модуль в процессе взаимодействия с базой не только читает из неё, а также изменяет и удаляет записи. Что создаёт весьма большое количество "мусора".

К примеру, проект с посещаемостью порядка 200 000 уникальных кликов в сутки создаёт порядка 100-200Мб мусора, что как Вы понимаете существенно "тормозит" работу с базой.

Какое решение?

Решение очень простое - использовать InnoDB, который в отличии от MyISAM блокирует только записи (а не всю таблицу) и производит процедуры "сжатия" после каждой операции. Тем самым не образовывает "мусор".

Что же всё-таки представляет собой так называемый "мусор"?

Не будем вдоваться в глубокие технические подробности, представьте себе лист бумаги. Например, Вы написали на нём 3 строки:

Строка 1
Строка 2
Строка 3

А теперь Вам надо убрать строку 2. Как Вы это сделаете наибыстрейшим способом? Правильно, вычеркните её. Теперь у Вас на листе бумаги:

Строка 1
Строка 2
Строка 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 (в любое место файла в отдельной строке).