0

我正在编写一个需要高度优化的解决方案的 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');

我在以下字段(基本上是所有内容)上创建了索引:

  • 工作.id
  • 工作.job
  • 路径.path
  • 路径.id
  • 修复.job
  • 修复路径

在每个“fixes”、“jobs”、“paths”表中都有 ~50,000 行,当前超时为 6 分钟

'explain' 命令显示以下信息,尝试破译

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;
4

3 回答 3

2

这不会得到相同的结果吗?

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%' 

OR 几乎总是一个昂贵的功能。

您也可以尝试联合查询,它们通常比 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-12T17:03:04.903 回答
2

你需要 DISTINCT 吗?也许在您的数据集中您不需要它。您可以尝试不使用它重写查询,并使用 path.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

如果您需要不同的, GROUP BY 可能会有所帮助。此外,您的原始查询中有两列称为“路径”。

于 2012-10-12T17:06:17.217 回答
1

用于Explain your sql query查看您的查询是否使用了这些索引

我确定您的索引是错误的,因为 6 分钟是查询的大量时间

于 2012-10-12T16:47:37.233 回答