Codeigniter会话类w /数据库存储选项未优化?

Cas*_*ynn 11 php mysql codeigniter session-state

我使用codeigniter的会话类和在数据库中存储会话数据的选项.这是为每个用户检索会话的请求运行的选择查询的示例:

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

以下是用户指南中定义的会话数据的表结构:

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)
);
Run Code Online (Sandbox Code Playgroud)

我的理解是,每当你有一个想要返回单个结果的查询时,最好使用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
Run Code Online (Sandbox Code Playgroud)

有没有什么理由不是这样写的?

Gri*_*gor 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字段是主键,因此它将是一个唯一的行

查询索引/唯一字段时是否有任何使用MySQL"LIMIT 1"的点?

所以看起来这实际上并不是一种优化,它只是不必要的.

  • 答案不正确/不清楚:没有LIMIT,将搜索整个表以查找与WHERE子句匹配的值.可能有数千条记录,因此这会影响性能.**应该*只有一行,即使*因某种原因*更多,CI仅*返回*第一行. (2认同)