我目前正在开展一个项目,该项目涉及更改存储在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
答案 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
只要列的组合是唯一的。