减少以下查询的执行时间

时间:2011-05-29 10:21:31

标签: mysql sql query-optimization

如何减少以下查询的时间?

SELECT *
FROM (`ci_session`)
WHERE `session_id` = '8011e978d8692846a22bc8f7f806af4d'
AND `user_agent` = 'Mozilla/5.0 (Windows NT 6.1; rv:2.0) Gecko/2010010' 

此查询在我的MySQL 5.5上执行大约需要0.3秒

这是一个非常重要的查询,因为它确定了用户的会话(PHP / CodeIgniter)

该表包含1000行。

5 个答案:

答案 0 :(得分:3)

开始时轻松获胜......

  1. 选择特定列,而不是*

  2. 为session_id和user_agent列添加索引

答案 1 :(得分:1)

确保ci_session表的session_id上有索引(或者后者是主键)。没有更多的事情可以让它更快。

答案 2 :(得分:1)

你需要选择*吗?

如果您只需要用户名,请选择该用户名。然后向表中添加一个复合索引:

user_agent, session_id, username

通过在索引中包含用户名,它应该能够直接从索引返回查询,而无需查找表中的行。

另外,你真的需要过滤user_agent吗? session_id不是唯一的吗?

答案 3 :(得分:1)

整数匹配总是比字符串匹配快(并且几乎总是具有较低的存储要求),因此请尝试使用整数会话ID而不是现在使用的字符串。

匹配较短的字符串比较长的字符串更快匹配,固定宽度字符串也比可变长度字符串(varchars)好一些,因此您可以考虑将哈希函数应用于用户代理并将其存储在固定宽度的字符串中领域。然后将代理字符串的MD5与存储的MD5的MD5进行匹配。

最后,但并非最不重要的是,索引可以为查询提供大量的加速,因此请考虑索引是什么,并添加适当的索引,如果索引似乎会加快查询速度。使用EXPLAIN SELECT将帮助您确定可以使用索引加速查询的位置。

答案 4 :(得分:1)

session_id是固定列,如果是这种情况,请尝试将其更改为CHAR(32)而不是VARCHAR

为session_id创建UNIQUE INDEX

CREATE UNIQUE INDEX idx_session ON ci_session (session_id)

或者带有前缀

INDEX
CREATE INDEX idx_session ON ci_session (session_id(8))

并更改前缀的长度以查看哪一个更快。