Когда дело доходит до написания настраиваемого управления сессиями PHP на базе MySQL для ОЧЕНЬ динамичного веб-сайта, какая самая лучшая структура (самая быстрая запись / запись) для вашей таблицы сеансов?
Плохой пример (не оптимизирован):
CREATE TABLE `session` ( `session_id` VARCHAR (32) NOT NULL, `session_data` ТЕКСТ NOT NULL, `t_created` DATETIME NOT NULL, `t_updated` DATETIME NOT NULL, ПЕРВИЧНЫЙ КЛЮЧ (`session_id`) ) ENGINE = INNODB DEFAULT CHARSET = utf8;
Я предполагаю, что использование Memory Engine будет лучше / быстрее, но я не уверен. Я не могу придумать хороший способ объяснить все на английском языке, поэтому я составил список требований / деталей, которые, по моему мнению, важны:
Детали:
Результаты:
Ожидаемый срок службы строк (например, длительность сеанса):
Ожидаемое количество строк (например, активные сеансы):
Если кто-нибудь может подумать о лучшем способе рассказать обо всем этом, не стесняйтесь редактировать.
Кажется, ваша интуиция верна. Я бы рекомендовал создать таблицу следующим образом:
CREATE TABLE session ( id CHAR(32) NOT NULL, data BLOB NOT NULL, t_created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, t_updated TIMESTAMP, PRIMARY KEY (session_id), INDEX t_created(t_created), INDEX t_updated(t_updated) ) ENGINE = MEMORY CHARACTER SET utf8;
Заметки:
Боковое замечание: я не уверен, как вы планируете собирать мусор – собираете свои сеансы, но если вы ожидаете, что 50% ваших сеансов будут менее 5 минут, как определяется окончание сеанса? Должен ли пользователь / клиент явно завершить сеанс (через выход из системы)? Если вы неявно завершаете сеансы, что быстро, ваши пользователи могут иметь очень грубое время с вашим сайтом.
Рассматривали ли вы использование memcached или APC для данных сеанса? Это почти наверняка будет намного быстрее, чем любое решение для РСУБД.
Другое предложение, если вы настроены на использование MySQL: вместо механизма хранения MEMORY просто включите большое количество памяти в различные буферы кэша. Таким образом, данные будут долговечными, прозрачно поддерживаться дисковым хранилищем, но будут доступны быстро, когда он будет использоваться.