[英]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_s
和samaccountname_r
。 由于您要在一个查询中同时检查这两个查询,因此请将它们放在同一索引中。 像这样
ALTER TABLE mytable add INDEX sam_index (samaccountname_s, samaccountname_r);
或像这样
CREATE INDEX sam_index ON mytable (samaccountname_s, samaccountname_r);
您应该在表中添加一些索引。 至少您要索引samaccountname_s
和samaccountname_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
您应该在查询中建立索引的列是:
希望能帮助到你!
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.