Я использую класс sessionigniter session с возможностью хранения данных сеанса в базе данных. Это пример запроса выбора, который выполняется для каждого запроса пользователя для получения сеанса:
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
Есть ли причина, по которой это еще не написано?