次の表を検討してください。
CREATE TABLE `event` (
`uid` bigint(13) NOT NULL,
`time` bigint(14) NOT NULL,
`type` smallint(5) NOT NULL,
`msg` varchar(2048) DEFAULT NULL,
KEY `uid` (`uid`),
KEY `time` (`time`),
KEY `time_type_uid` (`time`,`type`,`uid`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
私が基本的にしていること:
INSERT
1 日あたり最大 100 万行、現在のサイズは約 1 億エントリですDELETE
100 日以上前のすべての行:- ステートメント #1:
DELETE FROM event WHERE
time
< unix_timestamp()-100*86400; - ステートメント #2:
DELETE FROM event WHERE
time
< unix_timestamp()-100*86400 LIMIT 1000;
- ステートメント #1:
- ユーザーは
SELECT
すべてのイベントを UID で行います。合計で 1 日に約 500 件のクエリが実行されるため、それほど多くはありません。- ステートメント #1:
SELECT * FROM event WHERE
uid
=4711 ANDtype
IN (23,1002,12,1); - ステートメント #2:
SELECT * FROM event WHERE
uid
=4711 ANDtype
IN (23,1002,12,1) ANDtime
BETWEEN 1381051061 AND 1381051861;
- ステートメント #1:
特にジョブがテーブルのs/ s をDELETE
ブロックするため、このテーブルの処理は非常に遅くなりました。上記 (ステートメント #1) で説明したように、毎日の一括処理を試みましたが、テーブルをブロックしないと機能しなくなりました。現在、30 秒ごとに削除していますが (ステートメント #2)、これは 10 秒間ブロックされます。INSERT
SELECT
DELETE
負荷を増やす予定ですINSERT
が、最初のテストではスレッドが「システム ブロック」状態でハングします。これは I/O が原因であると推測されます。サーバー設定は、mysqltuner.pl で提案されているように最適化されています。ハードウェア システムには確実に I/O の問題があり、「現状のまま」ですが、残念ながらいくつかの理由で変更できません。ルートアクセスすらありません。
パーティショニングはソリューションでもありますか? MyISAM は使用するのに最適なエンジンですか? ハードウェアを改善する前に、可能な限り最適化する必要があります。