MYSQL超级超级密钥

时间:2012-08-23 13:39:39

标签: mysql

我目前正在开展一个项目,该项目涉及更改存储在MYSQL数据库中的数据。由于我正在处理的表没有密钥,因此我使用以下命令添加密钥:

ALTER TABLE deCoupledData ADD COLUMN MY_KEY INT NOT NULL AUTO_INCREMENT KEY

由于我想根据所选字段对记录进行分组,因此我尝试为包含MY_KEY的表deCoupledData创建索引以及所选字段。例如,如果我想使用字段STATED_F和NOT_STATED_F,我输入:

ALTER TABLE deCoupledData ADD INDEX (MY_KEY, STATED_F, NOT_STATED_F)

真正的问题是我通常使用的字段超过16,因此MYSQL不允许超过16个字段的超级密钥。 总之,还有另一种方法吗?我可以(以某种方式)MYSQL根据所需的超级密钥(类似聚类)来订购记录吗?我真的需要让我的脚本更快,主要的开销是每个组可能包含未存储在磁盘的同一页面上的记录,我假设我的电脑启动随机I / O以便检索记录。

感谢您的时间。 Nick Katsipoulakis

CREATE TABLE deCoupledData ( 
AA double NOT NULL DEFAULT '0', 
STATED_F double DEFAULT NULL, 
NOT_STATED_F double DEFAULT NULL, 
MIN_VALUES varchar(128) NOT NULL DEFAULT '-1,-1', 
MY_KEY int(11) NOT NULL AUTO_INCREMENT, 
PRIMARY KEY (MY_KEY), 
KEY AA (AA) ) 
ENGINE=InnoDB AUTO_INCREMENT=74358 DEFAULT CHARSET=latin1

1 个答案:

答案 0 :(得分:2)

好的,首先,当你在多列上添加一个索引并且你并没有真正使用第一列时,索引是无用的。

示例:您有一个类似

的查询
SELECT *
FROM deCoupledData 
WHERE
stated_f = 5
AND not_stated_f = 10

和索引超过(MY_KEY,STATED_F,NOT_STATED_F)。

只有在WHERE子句中有另一个AND my_key = 1或其他内容时才能使用索引。

想象一下,你想要用名字'John'查找电话簿中的每个人。然后,通过姓氏对书进行排序的知识是无用的,您仍然需要查找每个名称。

此外,主键不一定是代理/人工密钥。拥有一个由列组成的主键几乎总是更好,无论如何都会唯一地标识每一行。

拥有多个索引并不总是好事。索引不仅减慢了INSERT和UPDATE,有时它们只会导致额外的查找,因为首先查看索引,然后再查看实际数据。

这只是一些提示。也许乔丹的暗示并不是一个坏主意,“你应该发布一个新的问题,其中包含你的实际SQL查询,表格布局和性能问题”。

<强>更新

是的,这是可能的。根据{{​​3}}

  

如果在表上定义PRIMARY KEY,InnoDB会将其用作聚簇索引。

这意味着数据实际上是在磁盘上排序的,是的。

请注意,也可以在多列上定义主键!

CREATE TABLE deCoupledData ( 
AA double NOT NULL DEFAULT '0', 
STATED_F double DEFAULT NULL, 
NOT_STATED_F double DEFAULT NULL, 
MIN_VALUES varchar(128) NOT NULL DEFAULT '-1,-1', 
MY_KEY int(11) NOT NULL AUTO_INCREMENT, 
PRIMARY KEY (NOT_STATED_F, STATED_F, AA), 
KEY AA (AA) ) 
ENGINE=InnoDB AUTO_INCREMENT=74358 DEFAULT CHARSET=latin1

只要列的组合是唯一的。