Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 以其他优化方式编写SQL_Mysql_Sql - Fatal编程技术网

Mysql 以其他优化方式编写SQL

Mysql 以其他优化方式编写SQL,mysql,sql,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 overl

我有下面的问题,我写了如下。实际上,我想从颜色表中得到两种不同的颜色。请调查一下,你能告诉我这是一种优化的方式吗?我可以用其他优化的方式写下面的查询吗

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.*
    ,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

下面是获得等效结果的另一种方法:

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 
对于大型集合,选择列表中的相关子查询可能代价高昂。但是对于返回一行,这不会是性能问题,因为这些子查询只执行一次

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


您可能已经有了合适的索引。为了获得最佳性能,您需要indira.dress(id)(可能已经是主键)上的索引
,以及颜色(id)
(同样,可能已经是主键)上的索引
。添加覆盖指数可能不会给性能带来任何好处。

这里是另一个选项。我不知道你们的着装表上有哪些栏目,所以你们可能需要在“选择”和“分组”中列出这些栏目,但这应该行得通

不确定是否会更快/更慢,但希望给您更多选择;-)

这里是在sql FIDLE中,我还展示了如果为overlay指定null会发生什么。->


这一个有什么问题?你能告诉我哪一个更快吗?在现实生活中,使用这种类型的查询,它们都会非常快,甚至不值得测量(假设两个表上的
id
列都是主键)。在这一点上,这是一个风格决定。对于更复杂的查询或连接集,您必须对这两个选项进行一些分析。@Jimit-
您能告诉我吗?
最好用
自己解决吗?
尝试设置一个测试系统,并在您自己的真实世界设置中测量性能。我在两个查询上都打了标记,但我编写的查询要快一点。。。Jimit:0.328秒/0.000秒Joe:0.343秒/0.000秒这看起来是可行的,但查询并不直观。为了可读性,我建议不要使用这种方法。SQLFIDLE已经证明了它的有效性。OP中提到的优化不是可读性。如果表现是他最关心的,他应该测试所有的选择,并以这种方式做出决定。
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