我使用codeigniter的会话类,并将会话数据存储在数据库中。这是为每个用户检索会话的请求运行的选择查询的示例:
SELECT *
FROM (`ci_sessions`)
WHERE `session_id` = 'f7fd61f08a229kdu3093130a3da17e14'
AND `user_agent` = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:5.'
以下是user guide:
中定义的会话数据的表结构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
有没有任何理由不是这样写的?
答案 0 :(得分:6)
可能只有一行,匹配user_agent和session_id,因此不需要限制选择的数量,它已经被唯一的限制。
已向Bitbucket的Codeigniter Reactor devs报告该问题,并被视为无效:
https://bitbucket.org/ellislab/codeigniter-reactor/issue/422/session-class-should-use-limit-1-when
他们的回应:
session_id字段是主键,因此它将成为唯一的行
Is there any point using MySQL "LIMIT 1" when querying on indexed/unique field?
所以看起来这实际上不是优化,只是不必要。