頻繁な書き込みと全文列を使用して大規模なテーブルでmySQLデータベースを最適化しますか?

私のチームはショッピング情報サイトを運営しており、成長が始まった今、商品表のクエリ応答時間に問題が発生し始め、表示速度に影響を与えています。

私たちが経験する主な問題は、他のユーザーが存在するFULLTEXTインデックスを検索しているときに、更新クエリをトリガするアイテムをユーザーが「保存」するときです。

UPDATE product SET listed = listed+1 WHERE product_id = XX

たとえば、私は0.01秒で更新を実行しましたが、数分前に他のクエリが当たらず、大きなFULLTEXT要求もあり、同じ要求には23秒かかりました。

テーブルがMYISAMであり、行レベルのロックを行うことができないためです。

当社の製品表には350万件以上のレコードが含まれており、月末までに2倍になります。その後、毎月2〜5%の水準まで上昇するはずです。

CREATE TABLE product (
    product_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
    category_id INT UNSIGNED NOT NULL DEFAULT '0',
    title VARCHAR (100) NOT NULL DEFAULT '',
    short_desc VARCHAR (255) NOT NULL DEFAULT '',
    description TEXT NOT NULL,
    msrp DECIMAL (6,2) NOT NULL DEFAULT '000.00',
    rating DECIMAL(3,2) NOT NULL DEFAULT '0.0',
    reviews INT UNSIGNED NOT NULL DEFAULT '0',
    listed INT UNSIGNED NOT NULL DEFAULT '0',
    sku VARCHAR(75) NOT NULL DEFAULT '0',
    upc VARCHAR(20) NOT NULL DEFAULT '0',
    updateddate DATETIME NOT NULL,
    PRIMARY KEY (product_id),
    KEY title (title),
    KEY category_id (category_id),  
    KEY listed (listed),
    KEY mfrg_id (mfrg_id),
    KEY identifier (identifier),
    FULLTEXT INDEX (title),
    FULLTEXT INDEX (description)
) ENGINE = MYISAM;

データベースは、私たちのサイトだけをホストする専用サーバー上で動作します。私たちは、クエリボックス[slave]用のDual
Proc、16GB RAMサーバーと書き込み[dual proc、4GB RAM]を処理する現在の
“Web”サーバーを持つレプリケーション構造にデータベースを移行する予定です。

I’m not DB expert [clearly] and from researching have become
warry of running InnoDB at the same time as MYISAM [replication &
backup implications?] but it does seem like splitting the product
table to house main information [innodb] and the fulltext
descriptions [myisam] seperately may help dramatically?

アイデアがあり、より多くの情報が必要な場合はコメントしてください。

ありがとうございました

ベストアンサー

あなたはMyIsamについて正確です。 innoDBのような行ロックではなくテーブルロックです。

だから、あなたが言うことから、クエリ(フルテキスト)は多くの時間を要しているので、更新は完了する前に待つ必要があります。

innoDB(簡単な解決法)に切り替えるか、フルテキスト検索をsolr、elastic
search、sphinxのような別の場所に切り替えることを本当に考えてください。

また、slow_queryログを確認し、それらのクエリをすべて最適化する必要があります。

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です