【问题标题】:Choosing a primary key,surrogate key, index in the mysql stock trading database在mysql股票交易数据库中选择主键、代理键、索引
【发布时间】:2011-06-01 15:42:45
【问题描述】:

数据库类型:mysql

列: 日期、时间、价格1、数量1、价格2、数量2 时间将以毫秒为单位 一个月的记录数约为 550 万。

我不能选择日期作为主键,因为它不是唯一的,但可以选择日期和时间组合,但这也不是一个好主意。

我将运行类似的查询 在“这个日期和时间”和“那个日期和时间”之间选择价格和数量,结果可能在数百万范围内。

就主键、索引和代理键而言,什么可能是最佳选择,以及实现这一点的最佳方式是什么。我应该如何优化数据库。

【问题讨论】:

  • 您的专栏似乎有些欠缺 - 您还想加入其他专栏吗?

标签: mysql database indexing primary-key surrogate-key


【解决方案1】:

由于您没有自然键(因此每一行中没有唯一的),您需要添加一个代理键(为了参数“transactionid”)。您仍然可以根据日期时间(实际上应该是单列)建立索引,以进行有效的周期扫描。

【讨论】:

    【解决方案2】:

    不知道你为什么说同时选择日期和时间是个坏主意(你反对复合键吗?)

    对您来说更大的问题是时间不存储毫秒。有关更多数据,请参阅此错误:http://bugs.mysql.com/bug.php?id=8523

    此外,标识 Stock 的键中似乎缺少某些内容,例如 Ticker。由于股票代码会随着时间而变化,因此最好为其引入一个代理项,例如 StockID。您可以在名为 Stock 或类似的表中执行此操作。

    然后对于您的交易表,我建议使用 StockID、日期和时间(但将时间存储为 TIME 数据类型以外的其他数据类型,以便您可以存储毫秒。如果您需要帮助,请提出另一个问题)。

    PK 中键的顺序对于存储和检索都很重要。对于检索,您希望首先为您的查询放置最具选择性的键。因此,如果您倾向于一次访问一只股票(或一组股票)的所有数据,请将 StockID 放在首位,以便可以使用索引快速找到它们。如果您倾向于访问给定时间间隔的所有数据,请先放置日期,然后是时间。

    对于存储,最好是附加,因此在这里首先设置日期和时间也是一个好主意。

    如果您想主要在日期范围内访问,但有时通过 Stock 访问,请在 StockID 上放置一个二级索引。

    【讨论】:

    • 数据系列中没有 stockid 或类似的东西。股票 ID 将是文件名。我很清楚mysql在时间戳上有错误。我仍然不愿意选择日期和时间作为主键,因为第一个和第二个不同时区问题会出现格式问题。因为我将获得来自美国/英国/亚洲的数据。问题仍然是选择哪个作为主键、代理和索引。我也可能会根据 dateAndtime 进行比较,例如 GET DATA FOR dateAndtime1 > currentdateAndTime2。它是一个历史数据库,所以不再添加。
    • @ladz:“股票 id 将是文件名”。 “文件名”是什么意思?你的意思是列名吗?如果是这样,我建议您更改设计并将库存标识符本身放入一列。从长远来看,这将使事情更易于维护和查询。
    猜你喜欢
    • 1970-01-01
    • 2021-12-08
    • 1970-01-01
    • 1970-01-01
    • 2018-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-14
    相关资源
    最近更新 更多