0

我目前正在从事一个项目,该项目涉及更改存储在 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 以检索记录。

感谢您的时间。尼克·卡齐波拉基斯

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
4

1 回答 1

2

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

示例:您有一个类似的查询

SELECT *
FROM deCoupledData 
WHERE
stated_f = 5
AND not_stated_f = 10

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

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

想象一下,您想查找电话簿中名字为“John”的每个人。那么书按姓氏排序的知识是没有用的,你仍然需要查找每个名字。

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

此外,拥有许多索引并不总是好的。索引不仅会减慢 INSERT 和 UPDATE 的速度,有时还会导致额外的查找,因为首先查看索引,然后再查看实际数据。

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

更新:

是的,这是可能的。根据说明书

如果您在表上定义 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

只要列的组合是唯一的。

于 2012-08-23T14:19:14.123 回答