以其他优化方式编写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;

谢谢你的帮助。

这里有另一种获得等效结果的方法:

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)(同样,可能已经是主关键字)。添加覆盖指数可能不会带来性能上的好处。

这里是另一个选项。我不知道你在梳妆台上有哪些栏目,所以你可能不得不把你在选择和分组中列出的栏目都列出来,但这应该有效。

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

这里是在sqlfiddle中,我还展示了如果覆盖为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

由于您限制为一条记录,所以这可能很好。但你总是可以加入两次颜色表,比如:

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

最新更新