【问题标题】:Changing default sorting behavior of mysql更改 mysql 的默认排序行为
【发布时间】:2014-05-14 01:17:00
【问题描述】:

我的数据库中有一个表。

+--------+-------------+------+-----+---------+----------------+
| Field  | Type        | Null | Key | Default | Extra          |
+--------+-------------+------+-----+---------+----------------+
| id     | int(11)     | NO   | PRI | NULL    | auto_increment |
| rollno | int(11)     | NO   |     | NULL    |                |
| name   | varchar(20) | NO   |     | NULL    |                |
| marks  | int(11)     | NO   |     | NULL    |                |
+--------+-------------+------+-----+---------+----------------+

如果我查询默认情况下

select * from students;

显示按id INT (auto-increment)排序的结果。

+----+--------+------------+-------+
| id | rollno | name       | marks |
+----+--------+------------+-------+
|  1 |     65 | John Doe   |    89 |
|  2 |     62 | John Skeet |    76 |
|  3 |     33 | Mike Ross  |    78 |
+----+--------+------------+-------+
3 rows in set (0.00 sec)

我想更改默认排序行为并将rollno 设为默认排序字段,我该怎么做?

【问题讨论】:

  • 只需订购您想要订购的东西
  • 在我的情况下,我大部分时间都需要按 rollno 对其进行排序,所以我希望如果它默认按该顺序存储,我就不必在每个查询中进行排序。
  • 您所要求的基本上是不可能的。这将需要在每次更新时不断地使用表,任何 SQL 引擎都不会因为显而易见的原因而这样做。这样做比简单地在查询中添加ORDER BY 复杂得多。
  • 在我的情况下,插入/更新与选择相比要少得多,这就是为什么我要坚持修改排序。
  • 没有意义。 Mysql(或任何其他 DBMS)不会对表进行排序。从技术上讲,您可以在每次插入/更新后运行ALTER TABLE students ORDER BY rollno ASC;,但与仅对select 的结果进行排序相比,您会受到巨大的性能影响。对整个表进行排序,还是仅对 select 语句的结果进行排序,哪个更昂贵?是什么阻止您将 order by 添加到您的 select 语句中?

标签: mysql sql database sorting


【解决方案1】:

没有默认排序顺序!

数据库以最快的方式返回数据。如果这恰好是它的存储顺序或定义的密钥,那么这取决于系统。你不能依赖它。

想一想:如果您不需要订购某些东西,为什么数据库会默认使用 performace 订购它。 DB 针对速度进行了优化。

如果您想订购它,那么您必须在 order by 子句中指定。

【讨论】:

  • 在我的情况下,我大部分时间都需要按 rollno 对其进行排序,所以我希望如果它默认按该顺序存储,我就不必在每个查询中进行排序。
  • 你不懂。您不能依赖任何默认顺序。如果你想订购它 - 添加一个order by 子句。否则不要。这是订购可靠的唯一方法。
【解决方案2】:

运行这个

ALTER TABLE students ORDER BY rollno ASC;

【讨论】:

  • 这只会对表中的现有数据进行排序;如果添加或更改行,它将不会维护表中的排序顺序。您永远不应依赖表中的数据已经预先排序的假设。
  • 这正是我想要的,但正如@ElGavilan 所说,未来的插入/更新呢?
  • 数据库针对速度而非顺序进行了优化。只需要对 select 的结果进行排序比对表的全部内容进行一致排序要快得多。
【解决方案3】:

select * from students order by rollno asc; 将返回按该列排序的结果。需要注意的是,就数据实际存储在数据库中(除了身份和索引)而言,没有默认的排序行为;除非您明确对它们进行排序(使用order by),否则您永远不应该依赖以某种方式对结果进行排序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-19
    相关资源
    最近更新 更多