4

「resulta」テーブルに約 50 万件のレコードがあり、クエリを最適化するにはどうすればよいですか?

 SELECT
     hopcount, hop, round( avg( rtt ) , 2 ) AS avg, min( rtt ) AS min, max( rtt ) AS        max
FROM results
JOIN traces ON id = trace
WHERE target =9
AND rtt > -1
GROUP BY hop`  

出力の説明:

id  select_type     table   type    possible_keys   key     key_len     ref     rows    Extra   
1   SIMPLE  traces  ref PRIMARY,fk_traces_1_idx fk_traces_1_idx 5   const   26333   Using where; Using temporary; Using filesort  
1   SIMPLE  results ref trace   trace   5   pinger.traces.id    7   Using where

テーブル:

CREATE TABLE IF NOT EXISTS `results` (
  `hop` int(11) DEFAULT NULL,
  `trace` int(11) DEFAULT NULL,
  `rtt` int(11) NOT NULL,
  `seq` int(11) NOT NULL,
  KEY `trace` (`trace`),
  KEY `fk_hops_id` (`hop`),
  KEY `seq` (`seq`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;  
    CREATE TABLE IF NOT EXISTS `traces` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `hopcount` smallint(6) NOT NULL,
  `target` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `fk_traces_1_idx` (`target`,`id`,`time`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=52308;
4

1 に答える 1

3

MySQL ではGROUP BYORDER BY

この暗黙的な並べ替えを削除するには、追加しますORDER BY NULL

これは、SELECTのMySQLドキュメントで言及されています

GROUP BY を使用すると、同じ列に対して ORDER BY があるかのように、出力行は GROUP BY 列に従って並べ替えられます。GROUP BY が生成する並べ替えのオーバーヘッドを回避するには、ORDER BY NULL を追加します。

また、ORDER BY 最適化でも

于 2013-02-25T09:55:19.893 に答える