Класс сессий Codeigniter с возможностью хранения базы данных не оптимизирован? - PullRequest
11 голосов
/ 02 августа 2011

Я использую класс сеанса codeigniter с возможностью хранить данные сеанса в базе данных.Это пример запроса на выборку, который выполняется для каждого пользовательского запроса на получение сеанса:

SELECT *
FROM (`ci_sessions`)
WHERE `session_id` = 'f7fd61f08a229kdu3093130a3da17e14'
AND `user_agent` = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:5.'

Вот структура таблицы для данных сеанса, как определено в руководстве пользователя :

CREATE TABLE IF NOT EXISTS  `ci_sessions` (
session_id varchar(40) DEFAULT '0' NOT NULL,
ip_address varchar(16) DEFAULT '0' NOT NULL,
user_agent varchar(50) NOT NULL,
last_activity int(10) unsigned DEFAULT 0 NOT NULL,
user_data text DEFAULT '' NOT NULL,
PRIMARY KEY (session_id)
);

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

SELECT *
FROM (`ci_sessions`)
WHERE `session_id` = 'f7fd61f08a229kdu3093130a3da17e14'
AND `user_agent` = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:5.'
LIMIT 0, 1

Есть ли причина, по которой он еще не был написан таким образом?

1 Ответ

6 голосов
/ 05 августа 2011

Может быть только одна строка, соответствующая user_agent и session_id, поэтому не нужно будет ограничивать количество выборок, она уже ограничена тем, что является единственной.

О проблеме сообщили разработчики Codeigniter Reactor на Bitbucket и отклонили как недействительную:

https://bitbucket.org/ellislab/codeigniter-reactor/issue/422/session-class-should-use-limit-1-when

Их ответ:

поле session_id является первичным ключом, поэтому оно будет уникальной строкой

Есть ли смысл использовать MySQL «LIMIT 1» при запросе к индексированному / уникальному полю?

Так что может показаться, что на самом деле это не оптимизация, а просто не нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...