我的团队运营着一个购物信息网站,随着我们的发展,我们开始遇到产品表上的查询响应时间影响显示速度的问题。
我们遇到的主要问题是,当用户“保存”触发更新查询的项目时,其他用户也在搜索现有的全文索引:
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;
数据库在专用服务器上运行,该服务器仅托管我们的站点。我们计划将数据库移动到一个复制结构中,使用一个双进程的16 4gb服务器作为查询框从站,当前的"web“服务器处理写操作,双进程,4 4gb的ram。
我显然不是数据库专家,而且从研究中可以看出,在MYISAM复制和备份的同时运行InnoDB是不是很危险?但它看起来确实像是将产品表拆分为包含主要信息innodb和全文描述myisam分开可能会有很大帮助?
如果你有一个想法,并需要更多的信息,请评论,我会提供更多的细节。
谢谢
发布于 2011-11-13 11:48:31
你对MyIsam的看法很准确。它是表锁,而不是像innoDB那样的行锁。
因此,从您所说的情况来看,查询(全文)花费了大量时间,因此更新需要等待才能完成。
你真的应该考虑切换到innoDB (简单的解决方案),或者把你的全文搜索切换到其他地方,比如solr,elastic search,sphinx。
此外,您应该检查您的slow_query日志并优化所有这些查询。
https://stackoverflow.com/questions/8109412
复制相似问题