Mysql 在同一列上有一个唯一且正常的索引有多大的错误?

Mysql 在同一列上有一个唯一且正常的索引有多大的错误?,mysql,indexing,unique-index,Mysql,Indexing,Unique Index,我有下面的表结构 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`,`f

我有下面的表结构

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;
您会注意到,我在用户id上有重复的索引:
date\u expired
&
user\u id
。我当然想要唯一索引,因为我想确保数据是唯一的

重复索引的原因是,如果没有
用户id
索引,我的主搜索查询需要4秒钟。使用额外的索引需要1秒。查询正在加入
user\u id
上的表,并检查
date\u expired

这个表只有275条记录

  • 在同一个字段上有一个唯一且正常的索引有多糟糕
  • 当表纯粹是ID时,索引比数据大有多糟糕

包含多个索引(包括一个字段)一点也不坏(本质上,它们会索引不同的内容)。它对写性能有轻微的影响,但这是对每个索引的典型权衡。 如果空间便宜的话,让索引占用比数据本身更多的空间并不坏。在您的情况下,考虑到您的条目数量非常少,它应该是便宜的


在您的位置上,我要问的问题是:如此小的表的索引如何严重影响我的查询运行时?也许你做错了什么(我认为这个表可能有很多冗余的查询),因为只有这么少的条目,一个查询不应该在这个时间范围内。)

我不明白重复索引是什么意思。表中有三个索引:

  • 一个用于主键“id”(表示唯一)
  • “过期日期”、“用户id”和“外来id”组合的另一个唯一选项
  • 第三个仅在“用户id”上
  • 因此没有重复,您有三个不同的索引可以做不同的事情。您需要数字3来加速与您所看到的用户id相关的查询。所以这张桌子没有问题,你没有复制任何东西。关于第二个问题,这取决于您的需要,但是在索引中使用的空间比在数据中使用的空间要多肯定不是坏事


    例如,有一个唯一的('user_id')和一个键('user_id')(我甚至不确定MySQL是否允许这样做),因为一个索引将包含另一个索引,而没有任何好处

    我相信,如果您将自己的唯一索引创建为(
    user\u id
    date\u expired
    foreign\u id
    ),您将获得与唯一索引相同的好处,即在
    user\u id
    上有一个普通索引。MySQL可以使用任何索引的第一列来减少连接中的行数,方法与
    user\u id
    上的索引相同

    有关更多信息,请参阅

    您是否在架构的其他地方引用了
    id
    auto\u increment列以节省空间?因为您的唯一索引覆盖了表中的所有其他列,所以它本质上是一个主键,如果您不这样做,它可能会被删除


    您可以通过在查询前加上EXPLAIN来检查查询使用的键。

    太好了,我不知道!!这就是我所需要做的。我有一个主键,因为我使用的基本用户数据库管理系统要求我有一个主键。你是对的,我并不真的需要它,但它只是让我的生活更轻松,我怀疑它对速度有多大影响。酷,PostgreSQL也有类似的功能。我这么说是因为有人可能会像我一样怀疑这是否是一个常见的地方:-)查询中有20个表。这是一个最大的区别时,删除。