2011-11-13 23 views
1

我的团队运行一个购物信息站点,随着我们开始发展,我们开始遇到在我们的产品表上查询响应时间会影响显示速度的问题。在频繁写入和全文列的大型表上优化mySQL数据库?

我们遇到的主要问题是当用户“节省”触发更新查询其他用户的项目正在搜索的存在,以及在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服务器以及处理写入[双处理器,4gb ram]的当前“web”服务器。

我不是数据库专家[很明显],并且从研究中已经成为与MYISAM [复制&备份影响?]同时运行InnoDB的好方法,但它似乎将产品表拆分为主要信息[innodb ]和全文描述[myisam]分别可能会有很大的帮助?

如果你有一个想法,需要更多的信息,请评论,我会提供更多的细节。

谢谢

回答

1

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

因此,从您说的话来看,查询(全文)花费了大量时间,因此更新需要等待才能完成。

您应该切实考虑切换到innoDB(简单解决方案)或将全文搜索切换到其他位置,如solr,elastic search,sphinx。

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

+0

谢谢你的洞察力。你有什么想法分成两个表,myisam和innodb类型分别? –

+0

取决于很多东西,时间 - 经验 - 金钱。最简单的方法之一应该将您的全文字段移动到另一个表格。所以当你做“慢搜索”时,你仍然可以更新你的源表。 MyISAM全文中的7M行似乎是我想的很多数据。 – malletjo

+0

猜猜我们正在重新看狮身人面像。关于这个设置的任何特殊想法?只有一张桌子可以摆放关键领域的产品,还是将其分成两张[innodb]桌子的理由? –