1

〜50'000'000レコード(Webクローラーのタスク)を含むMyISAMテーブルがあります。

CREATE TABLE `tasks2` (
    `id` int(11) NOT NULL auto_increment,
    `url` varchar(760) character set latin1 NOT NULL,
    `state` varchar(10) collate utf8_bin default NULL,
    `links_depth` int(11) NOT NULL,
    `sites_depth` int(11) NOT NULL,
    `error_text` text character set latin1,
    `parent` int(11) default NULL,
    `seed` int(11) NOT NULL,
    `random` int(11) NOT NULL default '0',
    PRIMARY KEY  (`id`),
    UNIQUE KEY `URL_UNIQUE` (`url`),
        KEY `next_random_task` (`state`,`random`)
) ENGINE=MyISAM AUTO_INCREMENT=61211954 DEFAULT CHARSET=utf8 COLLATE=utf8_bin

数秒に1回、次のいずれかの操作が発生します(ただし、同時に発生することはありません)。

  1. INSERT ... VALUES(500行)-新しいタスクを挿入します
  2. UPDATE ... WHERE id IN(最大10 ids)-タスクのバッチの状態を更新します
  3. SELECT ... WHERE(next_random_task indexによる)-処理するタスクのバッチをロードします

私の問題は、挿入と更新が非常に遅いことです-数十秒のオーダーで、時には1分以上実行されます。ただし、選択は高速です。なぜこれが発生する可能性があり、パフォーマンスを向上させる方法は?

4

2 に答える 2

2

通常のハードウェアで約5,000万は、まともな数値です。

sfでこの質問に答えてください(InoDB用に作成されていますが、MyISAMにも同様のパラメーターがあります)

その後、あなたはのサイクルを開始する必要があります

  • あなたのパターンを理解する(またはあなたの仮定を確認する)ための遅いクエリを特定(ロギング)する
  • my.cnfを微調整するか、インデックスを追加/削除します(パターンによって異なります)
  • 改善の測定
于 2010-06-22T15:57:01.217 に答える
1
  • EXPLAINUPDATE主キーインデックスが使用されていることを確認するための完全なテーブルに対するサンプル。

  • またはに変更stateして、そのインデックスを小さくすることを検討してください。(実際にはこれを行わない可能性があります)。TINYINTENUMENUM

  • 一意のキーが必要urlですか?これにより、インサートの速度が低下します。

于 2010-06-22T15:55:55.730 に答える