【问题标题】:Are database tables sorted before or after being retrieved?数据库表是在检索之前还是之后排序的?
【发布时间】:2014-02-05 03:56:56
【问题描述】:

我正在为我的游戏创建一个存储在数据库中的高分表,但我想知道存储此类表的最佳做法。 是否应该在每次添加新分数时重新使用该表,还是应该对查询接收的数据进行排序?

似乎在服务器上只在检索数据时进行排序而不是每次都更新表会更容易。

【问题讨论】:

  • 数据库中的数据可以“排序”存储在磁盘文件中,但这种优化仅在您的数据很少更改/更新时才有用,因为任何此类更改都需要重新用新的顺序写入整个磁盘映像。对于一张普通的桌子,这将是一个非常低效的过程。
  • 使用索引,这个[问题可能有帮助][1] [1]:stackoverflow.com/questions/13944946/…
  • @MarcB 添加新乐谱是插入一行。这并不“需要用新的顺序重写整个磁盘映像”。它需要更新索引。
  • ejp:是的,但问题是关于存储预先排序的数据。如果您有 1,2,5,10 并插入 6,那么该要求将不允许 1,2,5,10,6 出现在磁盘上 - 您必须为 1 准备一块表, 2,5,6,10

标签: mysql sql database


【解决方案1】:

关系数据库(如 MySQL、Oracle、PostgreSQL 等)中的行不按任何顺序维护。在关系数据库的理论中,除非查询包含ORDER BY 子句,否则结果集不会以指定的顺序返回。每次检索数据时都(必须)应用任何排序。

在某些情况下,实现可能会按某种顺序存储数据,但它们不是必须这样做的。事实上,如果您对相同的数据运行完全相同的查询两次,则无法保证数据将以相同的顺序返回。

换句话说,您不能对数据强加存储顺序,您只能在执行查询时对结果集强加顺序。

【讨论】:

    【解决方案2】:

    我建议对 MySQL 查询中的数据进行排序。正如您所说,仅在需要时进行排序更容易,而不是在添加每条记录时进行。

    【讨论】:

      【解决方案3】:

      表中的数据未排序。关系表中行的实际物理顺序是不确定的。但是,有些数据库会根据聚集索引对磁盘上的行进行排序。

      如果您的表包含几千行,那么两种方法在性能方面并没有太大区别。但是,如果您的表超过 10,000 行,则可以使用聚集索引。 (关于聚集索引的参考,http://www.karafilis.net/sql-indexing-part2/)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-12-07
        • 2011-07-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多