クエリが数秒から数時間にジャンプするまで、優れたパフォーマンスを体験しています。
A)調査B)Mysqlで大量のデータをクエリする場合の主要なパフォーマンスのボトルネックを解決するにはどうすればよいですか?
おそらくメモリ関連ですか?
結果
ストアドプロシージャのパフォーマンスをテストする際に、最初に5分以内に2回実行しました...
mysql> CALL TopFromBigTable('2012-04-01','2012-05-01',5);
5 rows in set (23.76 sec)
これは非常に高速ですが、それから私はそれをもう一度呼び出します...私は1時間以上後にそれを殺しました!
mysql> CALL TopFromBigTable('2012-04-01','2012-05-01',5);
---TRANSACTION 1484EF5C, ACTIVE 3571 sec fetching rows, thread declared inside InnoDB 193
mysql tables in use 2, locked 1
MySQL thread id 466174, OS thread handle 0x7f3616ab4700, query id 33098684 localhost root Copying to tmp table
その他のテスト:
mysql> CALL TopFromBigTable('2012-05-01','2012-05-04',5);
5 rows in set (1.28 sec)
mysql> CALL TopFromBigTable('2012-05-01','2012-05-05',5);
5 rows in set (1.55 sec)
mysql> CALL TopFromBigTable('2012-05-01','2012-05-06',5);
5 rows in set (1 hour 47 min 37.99 sec)
詳細
テーブル
CREATE TABLE `BigTable` (
`BigTableID` int(11) NOT NULL,
`AnotherID` int(11) NOT NULL,
`Type` char(2) COLLATE utf8_unicode_ci DEFAULT NULL,
`StartTime` datetime NOT NULL,
`EndTime` datetime DEFAULT NULL,
PRIMARY KEY (`BigTableID`),
KEY `Type` (`Type`),
KEY `StartTime` (`StartTime`),
KEY `EndTime` (`EndTime`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
クエリ(このジェネリックを作成する際に私がgroup by
間違っていたことに注意してください)
CREATE PROCEDURE `TopFromBigTable` (
$StartDate DATETIME,
$EndDate DATETIME,
$ResultLimit INT
)
BEGIN
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;
SELECT
`Type`,
COUNT(*) AS Count
FROM
`BigTable`
WHERE
`StartTime` > $StartDate
AND
`StartTime` < $EndDate
GROUP BY
`Type`
ORDER BY
Count DESC
LIMIT $ResultLimit
;
COMMIT;
END $$
実行計画
EXPLAIN EXTENDED ...
id: 1
select_type: SIMPLE
table: BigTable
type: range
possible_keys: StartTime
key: StartTime
key_len: 8
ref: NULL
rows: 16446226
filtered: 100.00
Extra: Using where; Using temporary; Using filesort
私は専用のレポートデータベースで実行しているため、すべての通常のルールが適用されるわけではありません。つまり、精度は重要ではなく、このデータベースは過去6時間に更新されなかったため、オーバーヘッドを削減するためにコミットされていない読み取りを行いました。これが実際にどれだけ役立つかをベンチマークしたいのですが(仮にあったとしても)、ストアドプロシージャの時間を確実に計ることはできません!