简体   繁体   中英

Advanced query running slowly

Whenever I am running this query, it takes about 25-30 seconds for it to run. As you can see, the most advanced thing here is to calculate two coalesces within subqueries.

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;

Table structures/schemas:

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;

Indexes will definitely help, indexing fields used in JOIN criteria and in WHERE clauses carries the most impact.

Generic syntax example:

CREATE INDEX idx_col1col2 ON tbl_Test (Col1, Col2)

You don't likely want to just cram every field used into one index, and you likely shouldn't create an index for each field either.

There are many resources for helping you understand how to build your indexes, here are a couple items: MySQL CREATE INDEX Syntax MySQL Index Optimization

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM