多连接查询与使用函数之间的MySQL性能

时间:2012-12-26 16:29:15

标签: mysql database-performance

我有一个名为candidate_info的表有三列id_userid_typevalue

  • id_type = 1 =>全名
  • id_type = 2 =>电子邮件
  • id_type = 3 =>邮寄地址
  • id_type = 4 =>电话号码

存储用户信息:

我考虑如下两个查询,它将从行到列合并:

表格原件:

Id User | Id Type | Value
1       | 1       | John
1       | 2       | john@g.com
1       | 3       | Ho Chi Minh
1       | 4       | 123
2       | 1       | Ana
2       | 2       | ana@g.com
2       | 3       | New York
2       | 4       | 456

To New:

Id User | Fullname | Email        | Mailing_Address | Phone Number
1       | John     | john@g.com   | Ho Chi Minh     | 123
2       | Ana      | ana@g.com    | New York        | 456

1。第一个查询:

select
    c1.id_user,
    c1.value as fullname,
    c2.value as email,
    c3.value as mailing_address,
    c4.value as phone_number
from
    candidate_info c1
        left join
    candidate_info c2 ON c1.id_user = c2.id_user
        left join
    candidate_info c3 ON c1.id_user = c3.id_user
        left join
    candidate_info c4 ON c1.id_user = c4.id_user
where
    c1.id_type = 1
    and c2.id_type = 2
    and c3.id_type = 3
    and c4.id_type = 4;

2。第二次查询

select 
    c.id_user,
    MAX(IF(c.id_type = 1, c.value, NULL)) as fullname,
    MAX(IF(c.id_type = 2, c.value, NULL)) as email,
    MAX(IF(c.id_type = 3, c.value, NULL)) as mailing_address,
    MAX(IF(c.id_type = 4, c.value, NULL)) as phone_number
from
    candidate_info c
where
    c.id_type in (1, 2, 3, 4)
group by c.id_user

哪个更好?

修改:将id_entry_field更改为id_type,将join更改为left join,以便有意义。

3 个答案:

答案 0 :(得分:2)

您无法比较返回不同结果的查询。第一个版本将过滤掉没有4条记录的用户;第二个 - 不会。

如果您在第一个中使用LEFT JOIN,则比较会有意义。在那种情况下,我会打赌第二个;有一天我比较了两种方法的性能(虽然不是mysql),Oracle显示第一版更好,连接数最多为2;第二种方法表现更好......

答案 1 :(得分:2)

第二个查询更好,因为它不会像第一个查询那样创建大型笛卡尔积。相反,它只迭代表的记录一次,发出一行包含每个组的聚合数据。

答案 2 :(得分:0)

其他评论对于产生不同结果的查询是正确的。假设每行都有所有的entires(1,2,3,4),我会说运行一个测试应用程序来对它们进行基准测试。例如运行查询的时间几千次,看看哪一个平均更快。