减少以下查询的执行时间

问题描述

| 如何减少以下查询的时间?
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行。     

解决方法

        
session_id
是固定的带列的,如果是这种情况,请尝试将其更改为
CHAR(32)
而不是
VARCHAR
。 然后为session_id加上ѭ4。
CREATE UNIQUE INDEX idx_session ON ci_session (session_id)
或带前缀的
INDEX
CREATE INDEX idx_session ON ci_session (session_id(8))
并更改前缀的长度以查看哪个更快。     ,        几个简单的胜利开始... 选择特定的列,而不是* 为session_id和user_agent列添加索引     ,        确保您的
ci_session
表在
session_id
上有一个索引(或后者是主键)。您可以采取更多措施来加快速度。     ,        您是否需要选择*? 如果只需要用户名,则仅选择该用户名。然后将一个复合索引添加到表中:
user_agent,session_id,username
通过在索引中包括用户名,它应该能够直接从索引返回查询,而无需查找表中的行。 另外,您是否真的需要对user_agent进行过滤? session_id不是唯一的吗?     ,        整数匹配总是比字符串匹配快(并且几乎总是有较低的存储要求),因此请尝试使用整数会话ID代替您现在使用的字符串。 较短的字符串比较长的字符串匹配速度更快,并且固定宽度的字符串也比可变长度的字符串(varchars)好一点,因此您可以考虑将散列函数应用于用户代理并将其存储在固定宽度的char字段中。然后,将代理字符串的MD5与存储的字符串的MD5匹配。 最后但并非最不重要的一点是,索引可以大大提高查询的速度,因此请考虑一下您的索引,并在索引看起来可以加快查询速度的情况下添加适当的索引。使用EXPLAIN SELECT将帮助您确定可以在何处使用索引加速查询。