请注意,由于用户数量和数据的存在,数据库结构可能无法在没有大量工作的情况下进行更改。
“朋友”表基本上是这样的:
> 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
,其中user1
等于用户的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需要大约400ms而选项3只需要不到1ms。然而,每隔一次,opton 2需要0.6ms,选项2需要0.8ms。
我该怎么办?哪个选项实际上更快? 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