【问题标题】:MYSQL Long super-keysMYSQL 长超级键
【发布时间】:2012-08-19 01:07:23
【问题描述】:

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

【问题讨论】:

  • 听说过“过度索引”吗?请发送SHOW CREATE TABLE deCoupledData 并发布结果。也不要混淆关键字KEYPRIMARY KEY,一个简单的KEYINDEX的同义词,所以我猜你甚至没有主键。
  • 创建表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
  • 另外我不知道如何编辑它看起来像 sql 代码。因此,对于给您带来的不便,我深表歉意。
  • 我认为您真正的问题是:“如何使我的 SQL 查询更快?”。索引并不总是答案。有时表格布局就是答案。您可能应该发布一个包含实际 SQL 查询、表布局和性能问题的新问题。

标签: mysql


【解决方案1】:

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

示例:您有一个类似

的查询
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 的速度,有时还会导致额外的查找,因为首先查看索引,然后再查看实际数据。

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

更新:

是的,这是可能的。根据manual

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

只要列的组合是唯一的。

【讨论】:

  • 首先,我要感谢您的即时和有用的回答。就查询而言,我使用 MY_KEY 字段作为条件(WHERE 子句)。另外,我会使用另一个字段作为键,但它们都不是唯一的。我的主要问题是MYSQL中是否有任何方法可以命令MYSQL服务器根据我提供给它的字段来组织数据文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-21
  • 1970-01-01
  • 2011-02-05
  • 1970-01-01
  • 2014-07-27
  • 2012-04-22
  • 1970-01-01
相关资源
最近更新 更多