假设您有以下表格和数据:
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默认如何对记录进行排序?
每当我在 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 中是否有某些设置会导致这种不正确的排序?
这是主键中指定的排序顺序的衍生问题,但排序是在 SELECT 上执行的。
@Catcall关于存储顺序(聚集索引)和输出顺序的主题
很多人认为聚集索引可以保证输出的排序顺序。但这不是它的作用。它保证了磁盘上的存储顺序。 例如,请参阅此博客文章。
我已经阅读了 Hugo Kornelis 的博客文章,并了解到索引并不能保证 sql server 以特定顺序读取记录。然而,我很难接受我不能为我的场景假设这一点?
CREATE TABLE [dbo].[SensorValues](
[DeviceId] [int] NOT NULL,
[SensorId] [int] NOT NULL,
[SensorValue] [int] NOT NULL,
[Date] [int] NOT NULL,
CONSTRAINT [PK_SensorValues] PRIMARY KEY CLUSTERED
(
[DeviceId] ASC,
[SensorId] ASC,
[Date] DESC
) WITH (
FILLFACTOR=75,
DATA_COMPRESSION = PAGE,
PAD_INDEX = OFF,
STATISTICS_NORECOMPUTE = OFF,
SORT_IN_TEMPDB = OFF,
IGNORE_DUP_KEY = OFF,
ONLINE = OFF,
ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON)
ON …Run Code Online (Sandbox Code Playgroud) 我们需要向priority表中添加一列,该列每秒被命中约 250 次,大约 170 次选择、125 次插入和 60 次更新。该列将是一个简单的number(1).
在priority无关紧要的插入或更新,即不是主键,我将单独执行的一部分。
我们基本上不想order by每秒进行 170 次超范围扫描,因为执行的数量会大幅下降。
是否索引组织表保证这priority = 1将始终来之前priority = 9运行下面的查询时:
select *
from my_table
where rownum < 2
Run Code Online (Sandbox Code Playgroud)
对于稍微更多的上下文,典型的查询将是:
select *
from my_table
where mod(to_number(to_char(tstamp,'ss')),1) = 0
and done is null
and country = 'gbr'
and rownum < 2
Run Code Online (Sandbox Code Playgroud)
对于 IOT 的 pk 约束将成为priority, rest of the pk单独的 pk 约束,仅用于结构。done在表的大约 99% 中为空,所以这无论如何都不是很有选择性。 …