0

我有这个查询:

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

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

4

3 回答 3

3

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

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

或者像这样

CREATE INDEX sam_index ON mytable (samaccountname_s, samaccountname_r);
于 2012-12-20T16:29:19.297 回答
1

您应该向表中添加一些索引。至少你会想要索引samaccountname_sandsamaccountname_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);
于 2012-12-20T16:24:06.510 回答
0

您可能缺少索引。

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

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

您应该在查询中编制索引的列是:

  • samaccountname_s
  • samaccountname_r
  • 时间戳

希望能帮助到你!

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

于 2012-12-20T16:24:35.870 回答