我的团队运行一个购物信息站点,随着我们的增长,我们开始遇到产品表上的查询响应时间影响显示速度的问题。
我们遇到的主要问题是当用户“保存”一个条目触发一个更新查询时,其他用户也在对全文索引进行搜索:

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

例如,我只在0.01秒内运行更新,没有其他查询,但几分钟前,随着一个大型全文请求的执行,同一个请求花费了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;

数据库运行在一个专用服务器上,该服务器仅承载我们的站点。我们计划将数据库移动到一个复制结构中,使用一个双Proc、16gbram服务器(用于查询框[slave])和当前的“web”服务器(用于处理写操作)[Dual Proc、4gb RAM]。
我不是数据库专家[很明显],从研究开始,我就开始对与MYISAM[复制和备份的含义]同时运行InnoDB保持警惕?]但是,似乎将产品表拆分为包含主要信息[innodb]和全文描述[myisam]可能会有很大帮助?
如果你有一个想法,需要更多的信息,请评论,我会提供更多的细节回来。
谢谢你

最佳答案

你说的没错。它是表锁而不是像innoDB那样的行锁。
因此,根据您的说法,查询(全文)需要花费大量时间,因此更新需要等待才能完成。
你真的应该考虑切换到innoDB(简单解决方案)或者将全文搜索切换到其他地方,比如solr、elastic search、sphinx。
另外,您应该检查慢查询日志并优化所有这些查询。

关于mysql - 在频繁写入和全文列的大表上优化mySQL数据库?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8109412/

10-11 09:02
查看更多