Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 减少以下查询的执行时间_Mysql_Sql_Query Optimization - Fatal编程技术网

Mysql 减少以下查询的执行时间

Mysql 减少以下查询的执行时间,mysql,sql,query-optimization,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行 首

如何减少以下查询的时间

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行

首先是几场轻松的胜利

  • 选择特定列,而不是*

  • 为会话\u id和用户\u代理列添加索引


  • 确保您的
    ci_session
    表在
    session_id
    上有索引(或者后者是主键)。要使它更快,您所能做的不多。

    您需要选择*

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

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


    另外,您真的需要在用户代理上进行筛选吗?会话id不是唯一的吗?

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

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


    最后,但不是最不重要的,索引可以为查询提供一个巨大的加速,因此考虑索引是什么,如果索引看起来会加快查询速度,则添加适当的索引。使用EXPLAIN SELECT将帮助您确定在何处可以使用索引加速查询

    session\u id
    是固定的with列,如果是这种情况,请尝试将其更改为
    CHAR(32)
    ,而不是
    VARCHAR

    并为会话id创建一个
    唯一索引

    CREATE UNIQUE INDEX idx_session ON ci_session (session_id)
    
    或带有前缀的
    索引

    CREATE INDEX idx_session ON ci_session (session_id(8))
    

    然后更改前缀的长度,看看哪个更快。

    这些列上已经有索引了吗?
    user\u agent
    上的索引永远不会被使用。
    session\u id
    上的一个将更具选择性。公平点,但我很久以前就放弃了在数据库引擎如何使用/忽略索引方面应用太多逻辑:-)如果使用多个列并且索引只应用于一个列,我不会惊讶地看到它忽略索引。(以前在SQL server上看到过)这种事件通常发生在单列索引具有足够的选择性,能够自行返回一小部分行时。用它代替过滤器旁边的多列,这样会占用更少的内存。:-)包含需要返回的所有信息的索引的性能可能比只查找该行然后必须在该行中查找要返回的信息的索引快10倍。它的性能绝对值得。