仅使用主键提高表的SELECT性能

时间:2014-06-06 15:59:26

标签: mysql

我有一个包含8列的表,如下面的create statement中所示。

行必须是唯一的,也就是说,每行中没有两行可以具有完全相同的值。为此,我将每列定义为主键。

然而,执行下面的选择显示需要很长时间,因为我认为,MySQL必须扫描每一行才能找到结果。由于表格非常大,这需要花费很多时间。

您对我如何提高性能有任何建议吗?

编辑创建声明:

CREATE TABLE `volatilities` (
`instrument` varchar(45) NOT NULL DEFAULT '',
`baseCurrencyId` int(11) NOT NULL,
`tenor` varchar(45) NOT NULL DEFAULT '',
`tenorUnderlying` varchar(45) NOT NULL DEFAULT '',
`strike` double NOT NULL DEFAULT '0',
`evalDate` date NOT NULL DEFAULT '0000-00-00',
`volatility` double NOT NULL DEFAULT '0',
`underlying` varchar(45) NOT NULL DEFAULT '',
PRIMARY KEY   (`instrument`,`baseCurrencyId`,`tenor`,`tenorUnderlying`,`strike`,`evalDate`,`volatility`,`underlying`)) ENGINE=InnoDB DEFAULT CHARSET=utf8

选择声明:

SELECT evalDate,
max(case when strike = 0.25 then volatility end) as '0.25'
FROM niels_testdb.volatilities
WHERE 
instrument = 'Swaption' and tenor = '3M' 
and tenorUnderlying = '3M' and strike = 0.25
GROUP BY 
evalDate

1 个答案:

答案 0 :(得分:0)

您的一个要求是所有行都需要具有唯一值。这就是为什么您使用所有列的复合主键创建表的原因。但是,只要行本身是唯一的,您的表就会允许每列的重复值。

看看这个sql fiddler帖子:http://sqlfiddle.com/#!2/85ae6

在那里你会看到列仪器和男高音确实有重复的值。

我想说你需要更多地研究唯一键的工作原理以及主键是什么。

我的建议是重新考虑您的要求,并调查哪些内容需要独特,以及为什么并采用不同的结构来支持您的决策。在这种情况下,复合主键不是可行的方法。