1

我的表结构如下:

如果不存在则创建表commodity_data(
dataidbigint(20) unsigned NOT NULL AUTO_INCREMENT,
commoditysmallint(6) NOT NULL,
marketsmallint(6) NOT NULL,
quantityfloat NOT NULL,
price_minmediumint(9) NOT NULL,
price_maxmediumint(9) NOT NULL,
price_modalmediumint(9 ) NOT NULL,
datedate NOT NULL,
modifiedtimestamp 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 查询将花费一分钟或更长时间。

4

2 回答 2

2

尝试找出compound您需要哪些索引:如果您正在搜索commodityAND marketAND date,您应该在所有三个索引上都有 1(一)个索引。订购很重要,例如,如果您有时不包括market,则订单可能会消失INDEX(commodity,date,market) (最后未使用)。如果WHERE变化很大,则案例的多个复合索引可能会有所帮助(例如INDEX(commodity,date,market),但也INDEX(market,date,commodity)有。请记住,它们在编写/更新时会影响性能。

innodb_buffer_pool_size 尽管如此,一分钟还是很长的:确保您的数据库可以通过设置as high is it can go将表加载到内存中。之后,对仍然需要很长时间的查询运行上述 EXPLAINS 并从那里获取。

于 2012-05-06T09:24:46.537 回答
2

如果您在查询文本之前使用EXPLAIN运行选择查询,MySQL 将显示来自优化器的有关查询执行计划的信息,以及将加快查询速度的建议索引...

于 2012-05-06T09:18:28.160 回答