我正在编写一个SQL查询,它需要高度优化的解决方案,以避免超时。但是,我不知道如何持续优化以下SQL查询:
select distinct j.job,f.path,p.path
from fixes f, jobs j, paths p where f.job=j.id and p.id =f.path
and (p.path like '//Tools/Web/%' or p.path = '//Tools/Web');我已经为以下字段创建了索引(基本上是所有内容):
在每个“修复”、“作业”、“路径”表中都有大约50,000行,当前超时时间为6分钟。
“解释”命令显示以下信息,尝试解密
1 SIMPLE j index PRIMARY job 62 (null) 73226 Using index; Using temporary
1 SIMPLE f ref path,job job 8 j.id 825
1 SIMPLE p eq_ref PRIMARY,path PRIMARY 8 f.path 1 Using where“paths”表的表创建语句:
CREATE TABLE `paths` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`path` varchar(250) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `path` (`path`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8;发布于 2012-10-12 17:03:04
这不会得到同样的结果吗?
select distinct j.job,f.path,p.path
from fixes f
join jobs j on f.job=j.id
join paths p on p.id =f.path
where p.path like '//Tools/Web%' 或者几乎总是一个昂贵的特征。
您也可以尝试Union查询,它们通常比OR更快。
select j.job,f.path,p.path
from fixes f
join jobs j on f.job=j.id
join paths p on p.id =f.path
where p.path like '//Tools/Web/%'
union
select j.job,f.path,p.path
from fixes f
join jobs j on f.job=j.id
join paths p on p.id =f.path
where p.path = '//Tools/Web'); 发布于 2012-10-12 17:06:17
你需要不同的吗?也许,在您的数据集中,您可能不需要它。您可以尝试不使用这种方式重写查询,并使用path.p .p条件启动WHERE条件。您也可以尝试加入另外两个表。
例如。
select j.job,f.fix,p.path
from paths.p
join fixes f on (f.path = p.id)
join jobs j on (f.job = j.id)
where (p.path like '//Tools/Web/%' or p.path = '//Tools/Web')
group by job, fix, path如果您需要不同的,组可能会有帮助。另外,在原始查询中有两个名为"path“的列。
发布于 2012-10-12 16:47:37
使用Explain your sql query查看查询是否使用这些索引
我相信您的索引是错误的,因为6分钟的查询时间很长。
https://stackoverflow.com/questions/12863606
复制相似问题