【问题标题】:Is this the fastest way to get records in MySQL这是在 MySQL 中获取记录的最快方法吗
【发布时间】:2012-12-08 05:12:54
【问题描述】:

我有这个问题:

SELECT * FROM tablename WHERE
((samaccountname_s='".$sender."' AND samaccountname_r='".$contact."') OR
(samaccountname_s='".$contact."' AND samaccountname_r='".$sender."'))
ORDER BY timestamp ASC

而且它非常慢,我认为一些延迟可能是服务器造成的,但我不禁认为有一个更有效的查询来获得我在上面寻找的结果。

简而言之:查询检查两个人之间是否有消息($sender$contact

这可以更有效/更快地完成吗?

【问题讨论】:

  • 桌子有多大?上面有索引吗?
  • 你的表有索引吗?使用EXPLAINmysql优化器如何处理
  • 请出示您的CREATE TABLE 声明。您可能需要一些(或更好的)索引。
  • 对于dba.se 来说可能是一个更好的问题。
  • @Alnitak 我知道准备好的语句,在这种情况下,它们不是必需的。不过还是谢谢。

标签: php mysql latency


【解决方案1】:

samaccountname_ssamaccountname_r 上放置索引。由于您在一个查询中同时检查两者,请将它们放在同一个索引中。像这样

ALTER TABLE mytable add INDEX sam_index (samaccountname_s, samaccountname_r);

或者像这样

CREATE INDEX sam_index ON mytable (samaccountname_s, samaccountname_r);

【讨论】:

    【解决方案2】:

    您应该向表中添加一些索引。至少你会想要索引samaccountname_ssamaccountname_r 字段。像这样:

    ALTER TABLE tablename ADD INDEX IDX_tablename_samaccountname_s (samaccountname_s);
    ALTER TABLE tablename ADD INDEX IDX_tablename_samaccountname_r (samaccountname_r);
    

    索引时间戳列也可能会有所帮助,因为您在订单中使用它:

    ALTER TABLE tablename ADD INDEX IDX_tablename_timestamp (timestamp);
    

    【讨论】:

    • 我不确定“索引”列是什么意思,Google 的工作?
    • @F4r-20 - 添加了它的语句。运行一次,看看它对你有什么改变。
    • @F4r-20 - 是的,只需要运行一次即可创建索引。在那之后你永远不需要再次运行它们(除非你删除并重新创建表)
    • @AndyLester 我的意思是反对不得不多次这样做。谢谢 Eric 的帮助。
    • 是的,该查询修改表以添加索引。索引意味着数据库正在存储有关这些字段的附加信息,以便可以直接访问和比较它们。例如:您要查找行 WHERE id='1' ,如果您没有字段 id 索引,则查询将检索所有行,然后逐一比较它们,直到找到所有带有 id='1' 的行.如果你有一个索引,它可以用id=1直接访问所有这些,不到一秒就执行这个查询。
    【解决方案3】:

    您可能缺少索引。

    基本上,从性能的角度来看,索引使大量数据搜索变得可行。列并不总是被索引的唯一原因是因为索引也会减慢插入速度,尽管幅度不大。一个好的一般规则是在您通常搜索的字段上保留索引,例如外键等。

    这里是关于如何创建索引的 MySQL 文章: http://dev.mysql.com/doc/refman/5.0/en/create-index.html

    您应该在查询中建立索引的列是:

    • samaccountname_s
    • samaccountname_r
    • 时间戳

    希望对你有帮助!

    P.S.:您确实应该转义该查询中的值。考虑切换到 PDO (http://php.net/manual/en/ref.pdo-mysql.php),或者至少使用手动转义:http://php.net/manual/en/function.mysql-real-escape-string.php

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-19
      • 1970-01-01
      • 1970-01-01
      • 2016-07-02
      • 2020-11-12
      相关资源
      最近更新 更多