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

Dar*_*ein 6 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`,`foreign_id`),
  KEY `user_id` (`user_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
Run Code Online (Sandbox Code Playgroud)

正如您将注意到的,我在user_id上有重复的索引:date_expired&user_id.我当然想要唯一的索引,因为我想确保数据是唯一的.

重复索引的原因是因为没有user_id索引,我的主搜索查询需要4秒.使用额外的索引需要1秒钟.查询正在加入表user_id并进行检查date_expired.

该表只有275条记录.

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

Ken*_*son 8

我相信,如果您创建唯一索引为(user_id,date_expired,foreign_id),你会得到在具有正常指数同样的益处user_id只用唯一索引.MySQL可以使用任何索引的第一列来减少连接中的行数,其方式与索引相同user_id.

有关更多信息,请参阅MySQL的索引文档.

您是指id在架构中的其他位置使用auto_increment列来节省空间吗?由于您的唯一索引涵盖了表中的所有其他列,因此它本质上是主键本身,如果不是,则可以删除.

您可以通过在EXPLAIN前面添加前缀来查看查询所使用的密钥.