【发布时间】:2011-12-27 21:46:49
【问题描述】:
我的团队经营着一个购物信息网站,随着我们的发展,我们开始遇到产品表上的查询响应时间影响显示速度的问题。
我们遇到的主要问题是当用户“保存”一个触发更新查询的项目时,其他用户正在搜索也存在的 FULLTEXT 索引:
UPDATE product SET listed = listed+1 WHERE product_id = XX
例如,我刚刚在 0.01 秒内运行更新,但几分钟前没有其他查询命中,同时还有一个大型 FULLTEXT 请求,同样的请求花了 23 秒。
我认为这是因为该表是 MISAM 并且不能执行行级锁定。
我们的产品表包含超过 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;
数据库在仅托管我们网站的专用服务器上运行。我们计划将数据库移动到一个复制结构中,其中包含一个 Dual Proc、16gb RAM 服务器用于查询框 [slave] 和当前处理写入的“web”服务器 [dual proc, 4gb ram]。
[显然]我不是数据库专家,并且从研究中开始对与 MYISAM [复制和备份影响?] 同时运行 InnoDB 持谨慎态度,但这似乎确实像拆分产品表以容纳主要信息 [innodb]单独的全文描述 [myisam] 可能会有很大帮助?
如果您有想法并需要更多信息,请发表评论,我会提供更多详细信息。
谢谢
【问题讨论】:
标签: mysql query-optimization innodb myisam