我有以下表结构

CREATE TABLE `table` (
  `id` int(11) NOT NULL auto_increment,
  `date_expired` datetime NOT NULL,
  `user_id` int(11) NOT NULL,
  `foreign_id` int(11) NOT NULL,
  PRIMARY KEY  (`id`),
  UNIQUE KEY `date_expired` (`date_expired`,`user_id`,`foreign_id`),
  KEY `user_id` (`user_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

因为你会通知,我已重复的索引user_id: date_expired & user_id.我当然想的唯一的索引,因为我想确保数据的独一无二的。

因为重复的索引是因为没有 user_id 指标,我的主要搜索查询需要4秒钟。额外的指标需要1秒钟。查询加入上表 user_id 和检查 date_expired.

该表中仅有275记录。

  • 多么糟糕的是它有一个独特的和正常的指数在同一领域?
  • 多么糟糕的是它有较大的比索引的数据在该表是纯粹的id?
有帮助吗?

解决方案

我相信如果你创造了你唯一的索引作为(user_id, date_expired, foreign_id),您将得到相同的益处具有一个正常的索引 user_id 只有独特的索引。MySQL可以使用的第一列的任何指数的削减数中的行加入的同样方式作为一个索引 user_id.

看看 MySQL的索引的文件 更多的信息。

你指的是的 id auto_increment column其他地方在你的架构,保存空间吗?因为你的唯一指标涵盖的其他所有列在表中,它在本质上是一个主要关键本身并可以降如果你不是。

你可以检查是什么钥匙你的查询使用的前缀就与解释。

其他提示

我不明白你的意思是通过重复的索引。你有三个索引中的表:

  1. 一个主要关键'id'(这意味着独特的)
  2. 另一个独特的一个组合的'date_expired','user_id"和"foreign_id'
  3. 第三个'user_id'只

所以没有重复,有三个 不同的 索引,会做不同的事情。你需要3号速查询有关user_id这是什么你都看到的。所以没什么不对用这个特定表格,你是不是复制任何东西。关于第二个问题,它取决于你的需要,但肯定这不是 糟糕 有更多的空间用在索引的比的数据。

什么是坏,例如,有一个独特的('user_id')和后来的一个关键('user_id')(我甚至不知道如果MySQL将允许那样),因为一个指数将包括其他并没有什么收获。

有几个索引,包括一个领域是不是坏所有(从本质上讲,他们做不同的指数)。它有一个轻微的影响编写性能,但这是典型的贸易-你有每个指数在第一位。有索引吃了更多的空间数据本身并不坏,如果空间是便宜。在你的情况下,应当便宜,事实上,你有一个非常少量的项目。

这个问题我想问您的位置是:如何编制索引的这样一个小桌因此严重影响我查询的运行时?也许你正在做的事情是错误的(I考虑许多可能是多余的querys到这个表),作为单一一个应该够远这个时间范围内与这个小多项)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top