具有10多万行的MySQL表 - 如何使用索引加速搜索?

时间:2012-05-06 09:09:47

标签: mysql indexing

我的表格结构如下:

  
    

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查询需要一分钟或更长时间。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

尝试确定您需要哪些compound索引:如果您要搜索commodity AND marketdate,那么您应该拥有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并从中获取它。