使用频繁写入和全文列优化大型表上的mySQL数据库?

时间:2011-11-13 03:35:43

标签: mysql query-optimization innodb myisam

我的团队经营一个购物信息网站,随着我们的成长,我们的产品表上的查询响应时间也开始出现影响显示速度的问题。

我们遇到的主要问题是当用户“保存”触发更新查询的项目时,其他用户也在搜索现有的FULLTEXT索引:

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

例如,我只是在0.01秒内运行更新,没有其他任何查询,但几分钟前,同时还有大量的FULLTEXT请求,同样的请求需要23秒。

我认为这是因为该表是MYISAM并且不能执行行级锁定。

我们的产品表包含超过350万条记录,并将在月底前翻倍。之后,应该每月增加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服务器以及处理写入的当前“web”服务器[dual proc,4gb ram]。

我不是[数据库]专家[清楚]并且在研究过程中已成为与MYISAM同时运行InnoDB的担忧[复制&备份含义?]但它似乎将产品表拆分为主要信息[innodb],全文描述[myisam]分别可能有所帮助?

如果您有任何想法并需要更多信息,请发表评论,我将提供更多详细信息。

谢谢

1 个答案:

答案 0 :(得分:1)

你对MyIsam很确切。它是表锁而不是像innoDB那样的行锁。

因此,根据您的说法,查询(全文)需要花费大量时间,因此更新需要在完成之前等待。

您应该考虑切换到innoDB(简易解决方案)或将全文搜索切换到solr,elastic search,sphinx等其他地方。

此外,您应该检查您的slow_query日志并优化所有这些查询。