请注意,由于用户和数据的数量,如果不进行大量工作,可能无法更改数据库结构。
“朋友”表基本上是这样的:
> 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
要获取用户的朋友,我有三个选项:
- 单独选择
user2
whereuser1
等于用户的 ID,反之亦然,然后在 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 毫秒。然而,每隔一次,选项 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