繁体   English   中英

这是在MySQL中获取记录的最快方法

[英]Is this the fastest way to get records in MySQL

我有这个查询:

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 )之间是否存在消息

可以更高效/更快速地完成此操作吗?

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

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

或像这样

CREATE INDEX sam_index ON mytable (samaccountname_s, samaccountname_r);

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

索引timestamp列也可能会有所帮助,因为您通过以下方式按顺序使用它:

ALTER TABLE tablename ADD INDEX IDX_tablename_timestamp (timestamp);

您可能缺少索引。

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

这是有关如何创建索引的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的实时的逃生string.php

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM