我的表结构如下:
如果不存在则创建表
commodity_data
(
dataid
bigint(20) unsigned NOT NULL AUTO_INCREMENT,
commodity
smallint(6) NOT NULL,
market
smallint(6) NOT NULL,
quantity
float NOT NULL,
price_min
mediumint(9) NOT NULL,
price_max
mediumint(9) NOT NULL,
price_modal
mediumint(9 ) NOT NULL,
date
date NOT NULL,
modified
timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (dataid
)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=7059415 ;
我在此表上的 SELECT 将包含 WHERE 子句,其中搜索“商品”、“市场”和“日期”中的一个或多个。
我的 ORDER BY 将按 price_min、price_max 或 price_modal 以及有时是其他大多数字段。
该表最终将超过 1000 万行,并将继续以每天约 5 到 10000 的速度扩展。
我的服务器目前是 VPS 双 2.4Ghz xeon,4GB RAM。
唯一的索引当前位于“dataid”字段上。
我已经读过设置索引会有所帮助,我认为这些应该是关于商品、市场和日期的,但我想在继续之前检查这是否正确,除非有更好的方法来做到这一点。表大小将在 600MB 左右并且还在增长。
“commodity”和“market”字段是指其他表中商品和市场的ID。我要么 LEFT JOIN 要么如果它更快,我会将这些表读入 PHP 中的数组(简单的一级关联数组 id => 名称)。大约有 300 种商品和 2,000 个市场。
目前 SELECT 花费的时间太长,例如带有 WHERE 子句的 COUNT 查询将花费一分钟或更长时间。