2014-03-01 147 views
0

每当我运行此查询时,它需要大约25-30秒才能运行。正如你所看到的,这里最先进的东西是计算子查询中的两个联合。高级查询运行缓慢

SELECT 
    g.name, 
    g.id, 
    (
     SELECT 
      COALESCE (
       SUM(result2/result1) * (
        SUM(IF(result2 != 0, 1, 0)) * 0.1 
       ), 
       0 
      ) AS res 
     FROM 
      gump.war gwr 
     WHERE 
      started = 1 
     AND (UNIX_TIMESTAMP(time) + 7 * 24 * 60 * 60) > UNIX_TIMESTAMP() 
     AND gwr.guild1 = g.id 
     AND gwr.winner = g.id 
    ) + (
     SELECT 
      COALESCE (
       SUM(result1/result2) * (
        SUM(IF(result1 != 0, 1, 0)) * 0.1 
       ), 
       0 
      ) AS res1 
     FROM 
      gumb.war gwr 
     WHERE 
      started = 1 
     AND (UNIX_TIMESTAMP(time) + 7 * 24 * 60 * 60) > UNIX_TIMESTAMP() 
     AND gwr.guild2 = g.id 
     AND gwr.winner = g.id 
    ) AS avg 
FROM 
    gumb.guild g 
ORDER BY 
    avg DESC, 
    g.point DESC, 
    g.experience DESC LIMIT 10; 

表结构/模式:

CREATE TABLE `guild` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `name` varchar(12) NOT NULL DEFAULT '', 
    `owner` int(10) unsigned NOT NULL DEFAULT '0', 
    `level` tinyint(2) DEFAULT NULL, 
    `experience` int(11) DEFAULT NULL, 
    `win` int(11) NOT NULL DEFAULT '0', 
    `draw` int(11) NOT NULL DEFAULT '0', 
    `loss` int(11) NOT NULL DEFAULT '0', 
    `point` int(11) NOT NULL DEFAULT '0', 
    `account` int(11) NOT NULL DEFAULT '0', 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM AUTO_INCREMENT=0 DEFAULT CHARSET=latin1; 

CREATE TABLE `war` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `guild1` int(10) unsigned NOT NULL DEFAULT '0', 
    `guild2` int(10) unsigned NOT NULL DEFAULT '0', 
    `time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', 
    `type` tinyint(2) unsigned NOT NULL DEFAULT '0', 
    `price` int(10) unsigned NOT NULL DEFAULT '0', 
    `score` int(10) unsigned NOT NULL DEFAULT '0', 
    `started` tinyint(1) NOT NULL DEFAULT '0', 
    `winner` int(11) NOT NULL DEFAULT '-1', 
    `result1` int(11) NOT NULL DEFAULT '0', 
    `result2` int(11) NOT NULL DEFAULT '0', 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM AUTO_INCREMENT=0 DEFAULT CHARSET=latin1; 
+0

没有索引的记载。你有他们吗?如果没有,从那里开始。如果这没有多大帮助,请回来,但也请指定您制作的索引和记录数以及一些示例数据。 – GolezTrol

+0

试着用这个查询来阐述你想达到的目标。我认为可以尝试以不同的方式提高效率 –

+0

@GolezTrol我对这些指标不太了解。有没有关于如何添加它们的提示?顺便说一句。虽然没有太多记录 - “行会”有8000行,“战争”有1000行。 – Lucas

回答

0

指标有一定帮助,在JOIN标准和WHERE子句中使用索引字段进行的影响最大。

通用语法示例:

CREATE INDEX idx_col1col2 ON tbl_Test (Col1, Col2) 

你不容易希望只是临时抱佛脚使用到一个索引各个领域,你可能也不应该为每个字段上的索引。

有很多资源帮助您了解如何建立自己的指数,这里有几个项目: MySQL CREATE INDEX Syntax MySQL Index Optimization

+0

添加索引的效果并不好:查询时间:27.773s。我已经添加了两个索引(第一个在'guild'表中,第二个在'war'表中,包含WHERE子句字段+ SUM字段的索引。 – Lucas