这是获取MySQL记录的最快方法吗?

时间:2012-12-20 16:20:37

标签: php mysql latency

我有这个问题:

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

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

3 个答案:

答案 0 :(得分:3)

将索引放在samaccountname_ssamaccountname_r上。由于您在一个查询中检查两者,因此将它们放在同一索引中。喜欢这个

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

或者像这样

CREATE INDEX sam_index ON mytable (samaccountname_s, samaccountname_r);

答案 1 :(得分:1)

您应该向表中添加一些索引。至少,您需要为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);

答案 2 :(得分:0)

你可能缺少指数。

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

这是关于如何创建索引的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