【发布时间】: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