我注意到以下查询
SELECT * FROM 'mytable' ORDER BY 'myfield'
生成一个非常不同的表格
SELECT id FROM 'mytable' ORDER BY 'myfield'
我订购的字段是日期字段,对于50%的记录,该值为空。此外,如果在我的SELECT子句中,我将每个字段命名为而不是依赖于*,它实现与上面第二个查询相同的顺序。
任何人都可以请说明为什么会这样,以及我可以做些什么来获得一致的订购?
答案 0 :(得分:3)
如果没有第二级排序,空记录将按引擎所需的任何顺序出现...可能是ID上的索引顺序,或涉及日期的复合索引。如果您希望按日期字段确定一致的订购顺序,则表格的主键。如果不存在主键,则需要按使记录唯一的所有列进行排序。
所以..
SELECT id FROM `mytable` ORDER BY `myfield`, `PK`
VS
SELECT * FROM `mytable` ORDER BY `myfield`, `PK`
会产生相同的订单。
答案 1 :(得分:0)
看起来你是按字符串文字排序的。 'myfield'
周围的单引号有什么用?使用字符串文字,将为返回的每个行分配相同的确切值。 MySQL可以按照它选择的任何顺序返回行。没有任何违反ORDER BY'字符串文字'的顺序。如果优化器只丢弃无意义的ORDER BY子句,我不会感到惊讶。
在MySQL中,标识符可以通过将它们包含在反引号中来进行转义。在我的键盘上,这是左上角的`〜键,就在 1的左边! key。
单引号括起字符串文字。
(...绕过sql_mode中双引号和ANSI_QUOTES的讨论......)
此查询返回什么内容?
SELECT 'myfield' FROM mytable LIMIT 50 ;
在我的系统上,我得到50个相同字符串的副本。如果我将表名括在单引号中,则会出现语法错误。
字符串文字在ORDER BY子句中的工作方式完全相同...每一行都显示相同的字符串值。
您观察到的订购差异可能是由于不同的访问计划。检索一列可能是使用索引,所有列的检索可能是对表的完整扫描。
如果您的查询未使用单引号,请随时发布您正在执行的完全查询。