假设您有以下表格和数据:
create table t (
k int,
v int,
index k(k)
) engine=memory;
insert into t (k, v)
values (10, 1),
(10, 2),
(10, 3);
Run Code Online (Sandbox Code Playgroud)
发出select * from t where k = 10noorder by子句时,MySQL默认如何对记录进行排序?
更新 2014-12-18
由于对主要问题的压倒性回答是“否”,更有趣的回答集中在第 2 部分,如何使用明确的ORDER BY. 尽管我已经标记了一个答案,但如果有性能更好的解决方案,我也不会感到惊讶。
原来的
出现这个问题是因为我能找到的针对特定问题的唯一极快的解决方案只能在没有ORDER BY子句的情况下起作用。下面是产生问题所需的完整 T-SQL,以及我提出的解决方案(我使用的是 SQL Server 2008 R2,如果这很重要。)
--Create Orders table
IF OBJECT_ID('tempdb..#Orders') IS NOT NULL DROP TABLE #Orders
CREATE TABLE #Orders
(
OrderID INT NOT NULL IDENTITY(1,1)
, CustID INT NOT NULL
, StoreID INT NOT NULL
, Amount FLOAT NOT NULL
)
CREATE CLUSTERED INDEX IX ON #Orders (StoreID, Amount DESC, CustID)
--Add 1 million rows w/ 100K Customers each of whom had 10 orders
;WITH
Cte0 …Run Code Online (Sandbox Code Playgroud) 每当我在 SQL Server Management Studio 2008(数据库是 SQL Server 2005)的表中手动插入一行时,我的新行就会出现在列表的顶部而不是底部。我正在使用身份列,这会导致诸如
id row
42 first row
1 second row
2 third row
Run Code Online (Sandbox Code Playgroud)
当获取行且未明确排序时。当为 Web 应用提取行并更改TOP 1查询返回的内容时,这会导致不同的外观。
我知道我可以order by,但为什么会发生这种情况?我的大部分数据都是通过 Web 应用程序插入的,从该应用程序插入的所有数据都按照先进先出的顺序进行,例如,最新的插入位于底部,因此 ID 都在一行中。服务器或 Management Studio 中是否有某些设置会导致这种不正确的排序?
我在与 Lukas Eder的Twitter 对话中偶然发现了这个问题。
尽管正确的行为是在最外层查询上应用 ORDER BY 子句,因为在这里,我们没有在最外层查询中使用 DISTINCT、GROUP BY、JOIN 或任何其他 WHERE 子句,为什么 RDBMS 不只是通过传入的数据是按内部查询排序的吗?
SELECT *
FROM (
SELECT * FROM table ORDER BY time DESC
) AS t
Run Code Online (Sandbox Code Playgroud)
在 PostgreSQL 上运行此示例时,至少,您会为内部查询和此派生表示例获得相同的执行计划,以及相同的结果集。
因此,我假设 Planner 将简单地丢弃最外层的查询,因为它是多余的,或者只是通过内部表的结果。
有没有人认为情况可能并非如此?
mysql ×2
order-by ×2
sql-server ×2
identity ×1
index ×1
mysql-5 ×1
oracle ×1
postgresql ×1
select ×1
ssms ×1