-1

多くの行(最大1ビリオン)を持つテーブルのクエリを高速化するためにLinuxMySQLサーバーを最適化する方法。

サーバーは開発でのみ使用されるため、セキュリティ、可用性、またはリカバリは問題になりません。

ここに例があります:

ALTER TABLE link ADD UNIQUE KEY url_index(url(255))
  • 期間>6時間
  • リンク数(〜20 mil)
  • CPU使用率が低い(〜19%)
  • 高IO(iotopmysqlは主に600KB/sの読み取りと500KB/ sの書き込みを返し、99%のIOで2〜3 MB / sに急上昇しました)

リンクテーブル:

CREATE TABLE `links` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `url` varchar(2000) NOT NULL,
  `domain` varchar(255) DEFAULT NULL  
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=27765646 DEFAULT CHARSET=utf8;

私は専用のLinuxサーバー(ubuntu 12.10)を持っています

  • 6GBのRAM
  • 1 TB HDD(非SSD)

my.cnf(http://pastebin.com/vx6BNqrE)

ソフトウェア(クエリ/テーブルデザインとmy.cnfまたは他のサーバー構成)の観点から最適化できるものと、RAM以外のハードウェアの観点から最初にアップグレードする必要があるもの(残念ながら、RAMは3つのRAMスロットしか使用できないため、RAMはアップグレードできません) )。

updatead

4

1 に答える 1

1

1時間に数回のトランザクションが発生する可能性のあるマイクロ最適化を試してみるのではなく、スケーリングを開始する必要があります。

まず、SSDを入手します。より多くのスペースが必要な場合は、それらをRAIDします。パフォーマンスを本当に気にするなら、特にIOを見ると、SSDは巨大です。

第二に、1台のサーバーはこれまでしか移動できません。負荷の一部を取り除くスレーブのセットアップを開始する必要があります。スレーブは、気の利いたフェイルオーバーとしても機能します。

MySQLは実際にはオンデマンドのスキーマ変更用に作成されていないため、ALTERTABLEに答えるのは困難です。私は実際にサーバーをサービスから外してロックを防ぎ、alter tableを実行してから、サーバーが欠落していたものと同期し、他のサーバーとスイートをフォローします。ただし、実際には1つのスキーマを選択し、それを維持する必要があります。

頑張ってください!

于 2013-01-11T01:55:54.680 に答える