我有一个包含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
答案 0 :(得分:0)
您的一个要求是所有行都需要具有唯一值。这就是为什么您使用所有列的复合主键创建表的原因。但是,只要行本身是唯一的,您的表就会允许每列的重复值。
看看这个sql fiddler帖子:http://sqlfiddle.com/#!2/85ae6
在那里你会看到列仪器和男高音确实有重复的值。
我想说你需要更多地研究唯一键的工作原理以及主键是什么。
我的建议是重新考虑您的要求,并调查哪些内容需要独特,以及为什么并采用不同的结构来支持您的决策。在这种情况下,复合主键不是可行的方法。