优化和缩短联合查询

时间:2010-12-05 20:20:10

标签: php mysql

下面是我的查询,以获取一些对象的大量属性。无论如何都要优化和缩短它?

SELECT object_id, value, name FROM attr_text WHERE object_id IN ('43', '42', '41', '40', '39') 
UNION 
SELECT object_id, value, name FROM attr_varchar WHERE object_id IN ('43', '42', '41', '40', '39') 
UNION
SELECT object_id, value, name FROM attr_int WHERE object_id IN ('43', '42', '41', '40', '39') 
UNION
SELECT object_id, value, name FROM attr_decimal WHERE object_id IN ('43', '42', '41', '40', '39') 
UNION
SELECT object_id, value, name FROM attr_datetime WHERE object_id IN ('43', '42', '41', '40', '39') 

结果:

43   red    color1
43   blue   color2
43   small  size
42   black  color1
42   big    size

2 个答案:

答案 0 :(得分:2)

您可以做出的最明显的改进是使用合理的架构。

假设这不是一个选项,我建议将UNION更改为UNION ALL,因为您可能没有多个具有相同名称和值的属性。 UNION [DISTINCT]只是执行不必要的比较。在任何情况下,您都不会处理当前查询中具有相同名称和不同值的属性。

答案 1 :(得分:1)

我也建议你可以做的最好的改进是使用理智的架构。详细说明,如果您可以为对象定义离散的列列表,它将极大地简化您的SQL并提高性能,如下所示:

create table [Object] (
    [object_id] [int] IDENTITY(1,1) NOT NULL,
    [color1] [varchar](255) null,
    [color2] [varchar](255) null,
    [size] [varchar](255) null
    ... any other properties.... 
)

alter table Object
add constraint PK_object_id
primary key clustered (
    object_id
)

然后,您可以使用简单的选择选择所有对象:

select * from object where object_id in ( '43', '42', '41', '40', '39' )