0

私はこのクエリを持っています:

SELECT * FROM tablename WHERE
((samaccountname_s='".$sender."' AND samaccountname_r='".$contact."') OR
(samaccountname_s='".$contact."' AND samaccountname_r='".$sender."'))
ORDER BY timestamp ASC

そして、それは非常に遅いです、私は待ち時間のいくらかがサーバーにかかっているかもしれないと思います、しかし私は私が上で探している結果を得るためにもっと効率的なクエリがあると思わずにはいられません。

つまり、クエリは2人の間にメッセージがあるかどうかを確認します($sender$contact

これはもっと効率的/迅速に行うことができますか?

4

3 に答える 3

3

とにインデックスを付けsamaccountname_sますsamaccountname_r。1つのクエリで両方をチェックしているので、それらを同じインデックスに入れます。このような

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_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);
于 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 に答える