关于 sqlalchemy 中的 unique=True 和 (unique=True, index=True)

hjl*_*rry 8 python sqlalchemy

当我创建表时,像这样使用flask-sqlalchemy:

class Te(Model):
    __tablename__ = 'tt'
    id = Column(db.Integer(), primary_key=True)
    t1 = Column(db.String(80), unique=True, )
    t3 = Column(db.String(80), unique=True, index=True, )
Run Code Online (Sandbox Code Playgroud)

在我的 Sequel Pro 中,我得到了表创建信息:

CREATE TABLE `tt` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `t1` varchar(80) DEFAULT NULL,
  `t3` varchar(80) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `t1` (`t1`),
  UNIQUE KEY `ix_tt_t3` (`t3`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
Run Code Online (Sandbox Code Playgroud)

这意味着 t1 与 MySQL 中的 t3 完全相同?因此,当您定义时unique=True,不需要定义index=True?

谢谢。

Luc*_*sPC 6

我认为您对 sqlalchemy 中的索引目的有一个术语混淆。在 sql 数据库中使用索引来加快查询性能。

根据定义约束和索引的 sqlalchemy 文档

您会注意到索引键的使用,因为生成的 sql 代码是:

UNIQUE KEY `ix_tt_t3` (`t3`)
Run Code Online (Sandbox Code Playgroud)

sqlalchemy 名词索引的方式是idx_%columnlabbel. 这与生成的 sql 代码匹配。

所以索引的使用与否只与性能有关,唯一键意味着列值不能在'tt'表中的同一列中一直重复。

希望这可以帮助,

  • 为了简化答案,我会说:当您使用表的 PK 属性查询表时,通常查询性能相当快。但是,当您开始使用表的某些其他属性增加过滤器的数量时,查询需要时间来处理。因为“性能”一词取决于您的指标目标,而不是为所有其他列或仅某些列设置索引。如果经过小型分析后发现问题属于该表的查询访问,我建议您在应用程序的查询开始变慢时立即放置它们。 (3认同)
  • “索引”的目的是允许快速查找具有相应列值的行。所以是的,我确实建议这样做。 (2认同)