我的表格结构如下:
CREATE TABLE IF NOT NOT EXISTS
commodity_data
(
dataid
bigint(20)unsigned NOT NULL AUTO_INCREMENT,
commodity
smallint(6)NOT NULL,
market
smallint(6)NOT NULL,
quantity
浮动NOT NULL,
price_min
mediumint(9)NOT NULL,
price_max
mediumint(9)NOT NULL,
price_modal
mediumint(9)NOT NULL,
date
日期非空,
modified
时间戳NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
主要关键(dataid
)
)ENGINE = InnoDB DEFAULT CHARSET = latin1 AUTO_INCREMENT = 7059415;
此表上的我的SELECT将包含WHERE子句,其中包含一个或多个“商品”,“市场”和“日期”。
我的ORDER BYs将是price_min,price_max或price_modal,有时是大部分其他字段。
该表最终将超过1000万行,并将继续每天增加约5至10万行。
我的服务器目前是VPS双2.4Ghz Xeon,4GB RAM。
目前唯一的索引是'dataid'字段。
我已经读过设置索引可以提供帮助,我认为这些应该是商品,市场和日期,但我想在开始之前检查这是否正确,除非有更好的方法。表格大小约为600MB且不断增长。
“商品”和“市场”字段是指其他表中商品和市场的ID。我将LEFT JOIN或者如果它更快,我会将这些表读入PHP中的数组(简单的单级关联数组id => name)。大约有300种商品和2,000个市场。
目前SELECTs花费的时间过长,例如带有WHERE子句的COUNT查询需要一分钟或更长时间。
答案 0 :(得分:2)
如果在查询文本之前使用EXPLAIN运行选择查询,MySQL将显示优化器中有关查询执行计划的信息,以及将加快查询速度的建议索引...... / p>
答案 1 :(得分:2)
尝试确定您需要哪些compound
索引:如果您要搜索commodity
AND market
和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并从中获取它。