データベース構造は、おそらくその上にユーザーとデータの量に多くの作業なしに変更することはできませんのでご注意ください。
「友達」テーブルは基本的に次のようなものです。
> 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つのオプションがあります。
user2
ユーザーのIDと等しい場所を個別に選択しuser1
、その逆も同様です。次に、結果をPHPで結合します。SELECT IF(user1=@userid,user2,user1) FROM friends WHERE @userid IN (user1,user2)
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