0

データベース構造は、おそらくその上にユーザーとデータの量に多くの作業なしに変更することはできませんのでご注意ください。

「友達」テーブルは基本的に次のようなものです。

> show create table `friends`
CREATE TABLE `friends` (
    `id` int(10) unsigned NOT NULL auto_increment,
    `user1` int(10) unsigned NOT NULL,
    `user2` int(10) unsigned NOT NULL,
    PRIMARY KEY (`id`),
    UNIQUE KEY `user1_2` (`user1`,`user2`),
    KEY `user1` (`user1`),
    KEY `user2` (`user2`)
) ENGINE=InnoDB AUTO_INCREMENT=747908

ユーザーの友達を取得するには、次の3つのオプションがあります。

  1. user2ユーザーのIDと等しい場所を個別に選択しuser1、その逆も同様です。次に、結果をPHPで結合します。
  2. SELECT IF(user1=@userid,user2,user1) FROM friends WHERE @userid IN (user1,user2)
  3. SELECT user2 FROM friends WHERE user1=@userid
    UNION SELECT user1 FROM friends WHERE user2=@userid

オプション2と3のタイミングを試しましたが、ここで問題が発生します。最初に実行したとき、オプション2は約400ミリ秒かかりますが、オプション3は1ミリ秒未満しかかかりません。ただし、1回おきに、オプトン2は0.6ミリ秒かかり、オプション2は0.8ミリ秒かかります。

私は何をすべきか?実際に速いオプションはどれですか?EXPLAINクエリはこれを返します:

id   select_type  table      type  possible_keys key     key_len ref   rows   Extra
1    SIMPLE       friends    index NULL          user1_2 8       NULL  386438 Using where; Using index

id   select_type  table      type  possible_keys key     key_len ref   rows   Extra
1    PRIMARY      friends    ref   user1,user1_2 user1_2 4       const 8      Using index
2    UNION        friends    ref   user2         user2   4       const 8
NULL UNION RESULT <union1,2> ALL   NULL          NULL    NULL    NULL  NULL
4

1 に答える 1

2

ベンチマークを行うときはいつものように、キャッシュに注意してください。

SELECTを使用してクエリを測定します(構文を参照)。SQL_NO_CACHESELECT

于 2012-10-14T15:07:58.720 に答える