编写SQL其他优化方式

时间:2013-07-22 18:15:59

标签: mysql sql

我有下面的查询,我写的如下。实际上,我想得到两个差异。颜色表的颜色。请调查一下,你能告诉我它是优化方式吗?我可以在下面查询其他优化方式吗?

SELECT d.*, 
(SELECT c.clr_title FROM colors AS c WHERE c.id = d.base_color_id) AS base_color, 
(SELECT c.clr_title FROM colors AS c WHERE c.id = d.overlay_color_id) AS overlay_color  
FROM indira.dress AS d
WHERE id=669;

感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

这是获得同等结果的另一种方法:

SELECT d.*
     , b.clr_title AS base_color
     , o.clr_title AS overlay_color
  FROM indira.dress d
  LEFT
  JOIN colors b ON b.id = d.base_color_id
  LEFT
  JOIN colors o ON b.id = d.overlay_color_id
 WHERE d.id=669 

对于大型集合,SELECT列表中的相关子查询可能很昂贵。但是对于返回单行,这不会成为性能问题,因为这些子查询只会被执行一次。

在更一般的情况下,对于返回大量行,使用JOIN通常更有效。

您可能已经拥有合适的索引。为获得最佳性能,您需要索引ON indira.dress(id)(可能已经是主键)和ON colors (id)(同样可能已经是主键)。添加覆盖索引可能没有性能优势。

答案 1 :(得分:1)

这是另一种选择。我不知道你在礼服桌上有什么专栏,所以你可能不得不打电话给那些你选择和组的人,但这应该有效。

不确定它是否会更快/更慢但是想给你更多选择; - )

这里是sql小提琴,我还展示了如果为叠加给出null将会发生什么。 - > http://sqlfiddle.com/#!2/ebc82/3

SELECT
    d.name
    ,MAX(CASE WHEN d.base_color_id = c.id THEN c.clr_title ELSE NULL END) base_color
    ,MAX(CASE WHEN d.overlay_color_id = c.id THEN c.clr_title ELSE NULL END) overlay_color
FROM
    dress d
INNER JOIN colors c ON 
    c.Id IN (d.base_color_id, d.overlay_color_id)
WHERE
    d.id = 669
GROUP BY 
    d.name

答案 2 :(得分:0)

由于您限制为单个记录,因此它可能很好。但是你总是可以两次加入颜色表,比如:

select
    d.*
    ,base_color.clr_title base_color
    ,overlay_color.clr_title overlay_color
from
    indira.dress d
left join
    colors base_color on d.base_color_id = base_color.id
left join
    colors overlay_color on d.overlay_color_id = overlay_color.id
where
    d.id = 669