2014-03-01 72 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