当前位置:  开发笔记 > 后端 > 正文

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

如何解决《在同一列上有一个唯一且正常的索引有多错?》经验,为你挑选了1个好方法。

我有以下表格结构

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时,拥有比数据更大的索引有多糟糕?

Kendrick Eri.. 8

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

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

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

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



1> Kendrick Eri..:

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

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

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

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

推荐阅读
小妖694_807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有