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)
有没有什么理由不是这样写的?
可能只有一行,匹配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字段是主键,因此它将是一个唯一的行
所以看起来这实际上并不是一种优化,它只是不必要的.
| 归档时间: |
|
| 查看次数: |
832 次 |
| 最近记录: |