2012-12-20 22 views
0

記錄的最快方法我有這個疑問:這是獲得在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

難道這是任何更有效地/快速地完成之間的消息?

+2

多大表?你有沒有索引? –

+1

你有桌上的索引嗎?使用'EXPLAIN'如何mysql優化器治療 – GBD

+0

可能是[dba.se](http://dba.stackexchange.com/)更好的問題。 –

回答

3

看跌指數。既然你在一個查詢中檢查了兩個查詢,把它們放在同一個索引中。像這樣

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

或類似這樣的

CREATE INDEX sam_index ON mytable (samaccountname_s, samaccountname_r); 
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); 
+0

我不確定這是什麼意思'索引'列,爲谷歌工作? – George

+0

@ F4r-20 - 添加了它的聲明。運行一次,看看它如何改變你的事情。 –

+0

因此只運行一次這些查詢?我很好走? – George

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),或者至少是,使用手動轉義:上samaccountname_ssamaccountname_rhttp://php.net/manual/en/function.mysql-real-escape-string.php