mysql - 带有数据库存储选项的 Codeigniter session 类未优化?

标签 mysql codeigniter session-state php

我使用带有将 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/

相关文章:

php - 如何使用 FPDF 显示多个动态行?

javascript - Codeigniter:在动态文本框/文本区域上生成 id

php - 在 codeigniter 中连接表

Azure 角色开始顺序

java - request.getSession(false) 在调用 session.invalidate() 后不返回 null

mysql - 选择 type 上的所有数据,如果存在行则更改 select

Mysql数据分组和正则表达式

mysql - 如何将两个选择结果合并为列

php - 带有数据库选择的 CodeIgniter :

asp.net - session 状态信息无效,可能在 ASP.Net 中已损坏