【问题标题】:How to partition this table如何分区此表
【发布时间】:2011-08-06 14:54:05
【问题描述】:

这是我的桌子

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 秒。

如何让它更快?我正在考虑对这张表进行分区,但我真的不知道该怎么做,按日期还是按 Stock_Code ?

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

谢谢。

已编辑

我尝试添加索引Stock_Code, 这个查询速度更快

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

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

mysql> 设置会话 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 忽略索引(stock_code_stock_date) where stock_code = '1234' order by stock_date desc limit 100; 100 行(0.02 秒)

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

【问题讨论】:

  • 您没有足够的可用 RAM 来容纳此表及其索引吗?您的排序缓冲区是否足够大以容纳结果集?除了对数据进行分区之外,您还可以做很多事情。
  • 我觉得还不够,如果我在共享主机上运行如何优化它?
  • Ehrm,你不要在共享主机上运行这种东西,就是这样。获取 VPS。
  • 我认为表分区可以帮助加快这个查询。

标签: mysql


【解决方案1】:

索引用于 WHERE,但不用于 ORDER。所以你只需要为 Stock_Code 添加索引:

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

这应该会使您的查询速度更快。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-12
    • 1970-01-01
    • 2020-02-10
    • 2010-11-08
    • 1970-01-01
    相关资源
    最近更新 更多