MySQL:我应该在这个表中创建什么样的索引?

MySQL:我应该在这个表中创建什么样的索引?,mysql,indexing,Mysql,Indexing,假设这是表的SQL代码: CREATE TABLE `user_is_in` ( `id_user` INT NULL , `id_city` INT NULL , `when` DATETIME NULL , INDEX `fk_user` (`id_user` ASC) , INDEX `fk_city` (`id_city` ASC) , CONSTRAINT `fk_user` FOREIGN KEY (`id_user` ) REFERENCE

假设这是表的SQL代码:

CREATE  TABLE `user_is_in` (
  `id_user` INT NULL ,
  `id_city` INT NULL ,
  `when` DATETIME NULL ,
  INDEX `fk_user` (`id_user` ASC) ,
  INDEX `fk_city` (`id_city` ASC) ,
  CONSTRAINT `fk_user`
    FOREIGN KEY (`id_user` )
    REFERENCES `user` (`id` )
    ON DELETE CASCADE
    ON UPDATE CASCADE,
  CONSTRAINT `fk_city`
    FOREIGN KEY (`id_city` )
    REFERENCES `city` (`id` )
    ON DELETE SET NULL
    ON UPDATE CASCADE)
ENGINE = InnoDB;
该表的用途是存储一种Foursquare签入(用户一次在一个地方注册)

现在我有两个选择:

  • 创建一个包含3个字段且没有主键的唯一索引:

    唯一索引
    id\u user\u是唯一的(
    id\u user
    ASC,
    id\u city
    ASC,
    when
    ASC)

  • 创建一个额外的经典id自动增量字段

我不喜欢第二个选项,因为我想创建对用户和城市的查询(即:搜索在某个日期在某个城市签入的所有用户)


提前谢谢。

你应该同时做这两件事。添加自动递增的主键,并针对所有三列添加唯一性约束。如果最终需要,使用单独的系统分配键,您可以更轻松地为此新表定义外键。对所有三列都具有唯一性约束将确保不会创建重复数据

一些简短的旁注:

  • 因为这是一个关联表,所以列实际上应该是
    不为空
  • 你可能想把一个城市的所有信息级联到 关联表

如果此表将用作任何其他表中的外键,最好使用auto_increment int字段。否则,您将不得不在每个外部表中拖动user/city/when字段,这将很快成为一个严重的问题。对不起,我只是想了解创建哪种索引的建议。马克,这个表有两个fk,但没有其他表有外键。好的,我想你是对的。只有一点变化:我更喜欢“on delete restrict”,以防止意外删除。非常感谢!是的,删除限制也是一个很好的选择。祝你在接下来的节目中好运!