mysql ordery by 默认是如何进行排序的呢?

那天,坐在我旁边的那个人正对着电脑屏幕微笑。
数据按照消息的顺序显示在刚刚从数据库中出来的屏幕上。
他掐着喉咙对我说:“我看不懂这种SQL。
”我看了看他的笔记,因为里面写了很多字段名和顺序词。
偶然我说如果你要输入多个字段,比如先按年龄,然后除以身份证号码(如果年龄相同)。
他点点头,仿佛恍然大悟。
等等,我忍住这个念头。
如果年龄相同,身份证号码会一样吗?那么也许这取决于种族?还是靠告白?他没有再说话,或许心里在思考。

MySQL中ORDER BY详解 ORDER BY子句对查询结果排序的方法

哎呀,我给你讲讲当年的坑,关于MySQL。

记得有一年冬天,我帮忙建立了一个好友系统。
他的数据库表很大,查询速度很慢。
可以肯定的是,它的数据库有数十万条记录。
每次它都允许用户看到最新的订单,直接通过create_time ASC下订单。
结果每次都要扫描全表,很卡。

他当时就在想,我该怎么办?添加到列表!我向 create_time 列添加了一个索引。
一开始我加了普通索引,但发现效果一般。
后来我改成了list cover,也就是list里存放的是create_time。
查询时,数据库直接使用字符列表进行排序,而不需要回表查找其他数据。
嘿嘿,现在速度快多了!看哪,桌子上有十万条记录。
在我们添加到列表之前,我们被要求等待半天。
添加到封面列表了吗?它一闪就灭了。

什么时候决定使用表达式又是另一回事了。
遇到请求时,我必须显示用户的注册持续时间(现在是
registration_date)。
你猜怎么着?因为这是一个表达式,所以不能直接使用数据库索引。
只有所有班级的记录,然后才能算一个班级。
讽刺的是,当给予太多时,这种情况就会缓慢发生。
后来我将函数更改为 DATEDIFF(current_date, register_date)。
虽然还是一个字,但已经是更好的效果了。
但我不敢一直用这个招数。
这确实取决于具体情况。
对于一些复杂的嵌套函数,例如 WHEN(email) + YEAR(order_date),我通常建议忘记它并运行整个表。
不过,还是给了几千金币。

此外,何时使用边界的类型也很重要。
比如用户想查看最近1 0行,可以直接按create_time DESC LIMIT 1 0排序。
这样就避免了全部百万数据,只对最后1 0行进行排序,效率高很多。

顺便说一句,没有任何价值观可以移动痛苦。
以前,表中的年龄字段没有值。
当除以年龄增长时,所有值都为零。
我告诉客户这不直观,客户不高兴。
然后我使用了 merge(age, 0) 并且没有使用 row 0,这样就好多了。

所以你看,按照顺序,不考虑索引、表达式、限制和进程。
不要只看语法,需要结合实际场景来使用。

mysql默认按什么排序

老实说,MySQL 的默认顺序是从最小到最大查看第一列。
但别傻到真的相信这个默认规则。
去年我们在做这个几千万的项目时差点就掉进了陷阱。

先说最重要的一点:默认排序只能在结果集很小的时候使用。
去年我们有一个报表场景,数据量超过3 000条,在没有添加ORDER BY的情况下恰好也是如此。
一旦数量扩大到1 0万,一切都很顺利,用行话来说就是“雪崩效应”。
事实上,前面的轻微延迟导致后面的一切都变得平淡无奇。
还有一点是默认的升序特别困难,尤其是与批处理函数混合时。
例如,COUNT() 默认情况下不关心如何排序。
还有其他关键细节。
例如,检查用户名,添加WHERE Age > 1 8 ,则结果集默认按照用户名排序,与年龄无关。
说实话,这很令人困惑。

我最初以为默认排序就像第一列的升序一样简单,但后来我发现有些不对劲——例如,如何对两个空值进行排序? MySQL 总是将 NULL 排序为最小,这与某些数据库的行为不同。
等等,还有别的事。
默认的排序算法是快速排序,随着数据量的增加,排序会变慢。
如果您正在处理数亿条数据,建议改用堆排序。

简而言之,停止使用默认排序。
写SQL的时候带上ORDER BY。
至少清楚地告诉数据库你要如何排序。