无法确定哪个查询实际上更快

时间:2012-10-14 14:51:37

标签: php mysql

请注意,由于用户数量和数据的存在,数据库结构可能无法在没有大量工作的情况下进行更改。

“朋友”表基本上是这样的:

> 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

要获取用户的朋友,我有三个选择:

  1. 单独选择user2,其中user1等于用户的ID,反之亦然,然后将结果合并到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
  4. 我尝试了时序选项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
    

1 个答案:

答案 0 :(得分:2)

通常在进行基准测试时,请注意缓存。

使用SELECT子句衡量您的SQL_NO_CACHE查询(请参阅SELECT syntax)。