我使用带有将 session 数据存储在数据库中的选项的 codeigniter session 类。这是为检索 session 的每个用户请求运行的选择查询示例:
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 中定义的 session 数据的表结构:
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
为什么还没有这样写?
最佳答案
可以只有一行,匹配user_agent和session_id,所以不需要限制选择的数量,它已经被唯一限制了。
该问题已报告给 Bitbucket 上的 Codeigniter Reactor 开发人员,并因无效而被驳回:
https://bitbucket.org/ellislab/codeigniter-reactor/issue/422/session-class-should-use-limit-1-when
他们的回应:
the session_id field is a primary key so it's going to be a unique row
Is there any point using MySQL "LIMIT 1" when querying on indexed/unique field?
所以看起来这实际上不是优化,只是没有必要。
关于mysql - 带有数据库存储选项的 Codeigniter session 类未优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6913735/