如何分区这个表

时间:2011-08-06 14:54:05

标签: mysql

这是我的表

CREATE TABLE IF NOT EXISTS `results_stock_all` (
  `Result_Id` varchar(50) NOT NULL,
  `Stock_Date` date NOT NULL,
  `Stock_Code` varchar(20) NOT NULL,
  `Prev_Close` float(10,3) NOT NULL DEFAULT '0.000',
  `Open` float(10,3) NOT NULL DEFAULT '0.000',
  `Close` float(10,3) NOT NULL DEFAULT '0.000',
  `High` float(10,3) NOT NULL DEFAULT '0.000',
  `Low` float(10,3) NOT NULL DEFAULT '0.000',
  `Volume` int(11) NOT NULL DEFAULT '0',
  `Change` float(10,3) NOT NULL DEFAULT '0.000',
  `Change_Percent` float(10,3) NOT NULL
  PRIMARY KEY (`Result_Id`),
  KEY `Stock_Date` (`Stock_Date`),
  KEY `Stock_Code_Stock_Date` (`Stock_Code`,`Stock_Date`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

3,150,236行,MYISAM,数据大小:255.1MB,索引大小:209.5MB,Stock_Code:1468

我有两种经常使用的查询,

1)SELECT cols FROM results_stock_all WHERE Stock_Date ='2011-08-06'ORDER BY cols;

(没问题,很快)

2)SELECT cols FROM results_stock_all WHERE Stock_Code ='1234'ORDER BY Stock_Date DESC LIMIT 3000;

id  select_type table   type    possible_keys   key key_len ref rows    Extra
1   SIMPLE  results_stock_all   ref Stock_Code_Stock_Date   Stock_Code_Stock_Date   22  const   5173    Using where

我需要查询最新的3000行并将结果发送到图表软件。 但是,对于每个不同的Stock_Code,此查询在首次运行时大约需要17秒。

如何让它更快?我正在考虑对这个表进行分区,但我真的不知道怎么做,按Date或Stock_Code?

如果按Stock_Code分区,我相信会加快查询#2,那么查询#1

如何

感谢。

EDITED

我尝试添加索引Stock_Code, 它在这个查询中更快

SELECT cols FROM results_stock_all WHERE Stock_Code ='1234'Order By Stock_Date DESC LIMIT 3000;

但是当我试图在较小的结果集上运行时,

的MySQL> set session query_cache_type = 0;

的MySQL> select * from results_stock_all ignore index(stock_code)where stock_code ='1234'order by stock_date desc; 100行(0.00秒)

的MySQL> select * from results_stock_all ignore index(stock_code_stock_date)where  stock_code ='1234'按stock_date desc限制100的顺序; 100行(0.02秒)

我相信使用哪里比使用文件排序更快。

1 个答案:

答案 0 :(得分:1)

索引用于WHERE,但不用于ORDER。因此,您只需为Stock_Code添加索引:

alter table results_stock_all add index `Stock_Code` (`Stock_Code`);

这可以让您的查询更快。