2011-01-20 4 views
0

私は、製品とレビューの2つのテーブルを持つ1つのサーバで簡単なmysqlデータベースを実行しています。製品テーブルには約1,000万エントリがあり、レビューテーブルには約3,000万エントリがあります。エントリが30mlのテーブルは遅いです。 MySQLを最適化するか、mongodbに切り替えますか?

Db全体は約30Gbです。私はそれが遅くなっているように感じ、私はそれについて何をすべきかと思います。私はインデックスを作成しましたが、それは助けになりませんでした。たとえば、商品表にはカテゴリフィールドがあり、単純なときはselect * from products where category=2 - それは遅いです。

mongodbに切り替えるとこのような状況になるのですか、それともMysqlを何とか最適化すれば解決できますか?この場合、シャーディングやテーブルのサイズはそれほど大きくなく、他の方法を最適化することは可能ですか?あなたのkey_buffer_sizeはそう、小さすぎ方法であるかのように

テーブルとmy.cnfの

CREATE TABLE IF NOT EXISTS `products` (
    `id` int(11) NOT NULL auto_increment, 
    `product_title` varchar(1000) NOT NULL, 
    `product_id` varchar(100) NOT NULL, 
    `title` varchar(1000) NOT NULL, 
    `image` varchar(1000) NOT NULL, 
    `url` varchar(1000) NOT NULL, 
    `price` varchar(100) NOT NULL, 
    `reviews` int(11) NOT NULL, 
    `stars` float NOT NULL, 
    `BrowseNodeID` int(11) NOT NULL, 
    `status` varchar(100) NOT NULL, 
    `started_at` int(15) NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `id_index` (`BrowseNodeID`), 
    KEY `status_index` (`status`), 
    KEY `started_index` (`started_at`), 
    KEY `id_ind` (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=13743335 ; 


CREATE TABLE IF NOT EXISTS `reviews` (
    `id` int(11) NOT NULL auto_increment, 
    `product_id` varchar(100) NOT NULL, 
    `product_title` varchar(1000) NOT NULL, 
    `review_title` varchar(1000) NOT NULL, 
    `content` varchar(5000) NOT NULL, 
    `author` varchar(255) NOT NULL, 
    `author_profile` varchar(1000) NOT NULL, 
    `stars` float NOT NULL, 
    `owner` varchar(100) NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `product_id` (`product_id`), 
    KEY `id_index` (`product_id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=48129737 ; 

あなたのmy.cnfに基づいて、my.cnfの

set-variable = query_cache_size=1512M 
set-variable = thread_cache_size=8 
thread_concurrency = 8 
skip-innodb 
low-priority-updates 
delay-key-write=ALL 

key_buffer_size = 100M 
max_allowed_packet = 1M 
#table_open_cache = 4048 
sort_buffer_size = 2M 
read_buffer_size = 2M 
read_rnd_buffer_size = 8M 
myisam_sort_buffer_size = 50M 
set-variable = table_cache=256 
set-variable = query_cache_limit=1024M 
set-variable = query_cache_size=1024M 
+0

my.cnfとテーブル定義を指定できますか? –

+3

「遅い」とは何ですか?関係するテーブル、インデックス、クエリ/クエリには詳細はありませんが、正当化をmongodbに切り替えるように思えます。 –

+1

カテゴリの列の選択度はどのくらいですか?おそらくインデックスが選択*を助けることはありません.... –

答えて

3

からいくつかの情報、それが見えますすべての読書のためにディスクに行きます。理想的には、その値はMyISAMインデックスの合計サイズより大きく設定する必要があります。

DBテクノロジを変更する前に、テーブルタイプをInnoDBに変更することを検討することもできます。あなたのmy.cnfは無効になっています。私はスマートなインデックスと十分なメモリを備えた300Mの行テーブルからかなりの驚異的なパフォーマンスを得ました。 InnoDBはまた、テーブル全体をロックしないので、より長い実行読み込みでいくらか余裕を持てます。

+0

アドバイスをいただきありがとうございます。 300M?それが印象的です!すべて同じサーバーと単一のテーブルにありますか?シャーディングはありませんか?あなたはどれくらいのRAMを持っていましたか? WHEREまたは注文を使って簡単なクエリを作成できましたか? – Arty

+1

@Arty - http://stackoverflow.com/questions/4419499/mysql-nosql-help-me-to-choose-the-right-one-on-a/4421601#4421601(私のデスクトップ) –

関連する問題