Im以下のクエリを使用して、個々の会社ごとの上位5件の費用を計算し、それらをソートします。現在、テーブルには約300万行があり、正しく実行するには約8秒かかります。私はこれをスピードアップする方法を探しています。このSUMクエリを高速化するにはどうすればよいですか?
SELECT
SUM(cost) as sumw,
company FROM cost
WHERE
datetime BETWEEN '2016-10-01' AND '2016-12-01'
GROUP BY company
ORDER BY sumw desc
LIMIT 5;
datetimeにはインデックスがあります。
はEXPLAIN:(datetime, company, cost)
は、このクエリのパフォーマンスを向上させることができるかもしれ上
1 SIMPLE cost NULL ALL datetime NULL NULL NULL 3204715 50.00 Using where; Using temporary; Using filesort
があなたのcost
テーブルの上に
CREATE TABLE `cost` (
`id` bigint(8) unsigned NOT NULL AUTO_INCREMENT,
`company` varchar(45) DEFAULT NULL,
`cost` bigint(8) unsigned DEFAULT NULL,
`datetime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `datetime` (`datetime`)
) ENGINE=InnoDB AUTO_INCREMENT=3335830 DEFAULT CHARSET=utf8;
ハードウェアを追加します。またはクエリの前に毎日/毎時の合計を生成することができます。 SQLは可能な限り効率的に見えます。たぶん、文字列を日付にキャストして、暗黙的にそれを行う必要はありませんが、それがあなたに多くをもたらすとは想像できません。 MySQLの外では、定期的なリフレッシュを伴うマテリアライズドビューを提案するかもしれませんが、MySQLはそれらを持っていません。 – xQbert
索引を含む、関連する表定義を表示するには、SQLパフォーマンスのヘルプを要求するのが慣例です。 'EXPLAIN'の出力を表示することも良い考えです。 –
追加情報@ O.Jones – Ray