为什么每次创建带日期的表时都会看到“index = True”?将数据存储为索引而不仅仅是日期有什么好处?
class Puppy(Base):
"""Connects to the Puppy table
"""
__tablename__ = 'puppy'
puppy_id = Column(Integer, primary_key = True)
name = Column(String(10), nullable = False)
picture = Column(String)
dateOfbirth = Column(Date, index = True)
breed = Column(String(80), nullable = False)
gender = Column(String(6), nullable = False)
weight = Column(Integer, nullable = False)
shelter_id = Column(Integer, ForeignKey('shelter.shelter_id'))
shelter = relationship(Shelter)
答案 0 :(得分:1)
一点背景。
SQL索引不是单个数据位的特殊存储类型,而是数据集的优化存储类型。它告诉数据库保留以预先排序的格式存储的该列或列组的副本,并针对该特定数据类型进行了优化。索引通常放置在您希望进行大量搜索(where子句)或加入的列上,以加快这些操作。
除了显而易见之外,这还有许多好处,例如DBMS可以使用预优化数据进行所有评估,并且无需从磁盘读取完整表就可以完成所有这些操作,这可能非常昂贵。在确定它需要什么之后,它只需要通过使用指向存储在索引中的完整行的指针来访问满足查询条件的磁盘上的行子集。
如果只从表中请求索引数据,那么很多DBMS'将更进一步,永远不会从磁盘中拉出实际的表,只需从索引中提取数据。
因此,日期经常编入索引的原因通常与日常时间数据在人类体验中的使用方式有关。这是一个常见的选择条件("给我上周的所有销售额"),一个共同的加入条件("将本月的销售额与上个月的比较") ,并且经常需要一些数据来回答不需要额外元数据的问题("客户在哪一天进行购买?")
另外值得注意的是,无论数据库的格式是什么,都会将日期时间数据返回给你(2015-10-23 12:34:56),大多数情况下它在内部将其存储为整数(自1970年以来的秒数)或作为固定精度十进制(例如,如果它有微秒),并在返回给你时转换它。与其他数据类型相比,整数和固定小数非常容易(计算上)进行索引,排序,连接和操作。
这就是为什么整数是主键的默认选择,没有强烈的理由不这样做,并且日期只是从整数中计算一次,当数据库在转换日期时间之间执行十亿次操作时在对int的查询中,并在返回数据时将其转换回来,实际上并不昂贵。因此,您已经获得了一个数据类型,该数据类型的索引非常好,除了对使用数据的人类有很多意义外,还有一个随机整数。