Mysql 提高仅使用主键的表的选择性能

Mysql 提高仅使用主键的表的选择性能,mysql,Mysql,我有一个包含8列的表,如下面的create语句所示 行必须是唯一的,也就是说,没有两行可以在每列中具有完全相同的值。为此,我将每个列定义为主键 然而,执行下面的select-as-show需要非常长的时间,我想MySQL必须扫描每一行才能找到结果。由于桌子很大,这需要很多时间 你对我如何提高绩效有什么建议吗 编辑创建语句: CREATE TABLE `volatilities` ( `instrument` varchar(45) NOT NULL DEFAULT '', `baseCurren

我有一个包含8列的表,如下面的create语句所示

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

然而,执行下面的select-as-show需要非常长的时间,我想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
Select语句:

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

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

请看这篇sql fiddler文章:

在这里,您将看到列instrument和tenor确实有重复的值

我想说的是,您需要进一步研究唯一键是如何工作的以及主键是什么


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

请显示create table语句。一个表只能有一个主键。“我将每个列定义为主键”是什么意思?create语句类似于:
create TABLE'niels\U testdb'。“my\U TABLE”('column1'INT NOT NULL,'column2'INT NOT NULL,'column3'INT NOT NULL,'column4'INT NOT NULL,'column5'INT NOT NULL,'column6'INT NOT NULL,'column7'INT NOT NULL,'column8'INT NOT NULL,主键('column1','column2','column3','column4','column5','column6','column7','column8
create table
语句将不起作用,因为您使用的是完全不需要引号的单引号。
SHOW create table niels_testdb.my_table
的实际输出将在这里帮助我们……通过上面的示例,MySQL将能够使用
column1
的索引,因为它是最左边的列复合键中的umn。不过我怀疑还有更多内容……您的create语句不起作用,您是指反勾号(`)而不是单引号(')?无论哪种方式,这都不是每列上的主键,而是每列上的主键(1个主键,涵盖8列)。我郑重建议循环使用如何创建唯一约束,而不是以这种方式误用主键。主键应该是数据库引擎的行标识符(这解释了为什么返回一行要花很长时间)。感谢您的回答。我现在正在考虑添加一个主键列,其中包含所有其他列的md5和。这样,唯一性将得到满足。我确实会对唯一键的工作进行更深入的调查。很抱歉,由于冲突,md5不会执行您想要的操作。