MySql 你知道 order by 是怎么回事吗? MySql全字段排序与 rowid 排序

全字段排序:
初始化sort_buffer。

从索引取数据,存入sort_buffer。

排序sort_buffer。

适用于少量字段,小数据量。

超出sort_buffer_size用磁盘排序。

rowid排序:
sort_buffer存排序字段和id。

排序sort_buffer。

用id回表取数据。

适用于多字段,大数据量。

增加回表开销。

选择机制:
自动根据数据量、字段大小、参数选排序方式。

全字段排序减少回表。

rowid排序避免内存溢出。

优化:
调整sort_buffer_size。

设计索引,减少排序数据量。

查看:
EXPLAIN看执行计划,用filesort判断。

实在话:调整参数,优化索引,看EXPLAIN。

mysql如何实现多字段排序

上周跟你讲过MySQL排序的事儿。

多字段排序用ORDER BY子句。

先比第一个字段。

第一个字段一样的,再比第二个字段。

一直比下去。

比如:
sql SELECT FROM students ORDER BY grade ASC, score DESC;
先按grade升序排。

同grade的,再按score降序排。

索引能加速排序。

最好建复合索引。

比如(grade, score)这个顺序。

索引顺序要和ORDER BY一致。

如果grade ASC, score DESC,可能用不上索引。

覆盖索引更好。

索引里包含所有用到的字段。

不用回表查数据。

filesort要避免。

性能很差。

怎么避免?
建好索引。

用WHERE子句过滤数据。

减少排序的数据量。

排序字段要选好。

选区分度高的字段先排。

比如grade比name好。

name可能有很多重复的。

NULL值怎么排?
默认最小,排最前面。

可以改。

SET sql_mode='...,NULLS LAST';
改完后,NULL值排最后。

看执行计划。

用EXPLAIN。

比如:
sql EXPLAIN SELECT FROM students ORDER BY grade, score;
看type列。

如果是ALL,说明没走索引。

Extra里有Using filesort,说明是filesort。

得优化。

SQL语句也该改。

不用SELECT 。

只查需要的字段。

减少I/O。

sort_buffer_size可以调大。

默认2 5 6 KB。

读数据多的话,调大点。

read_rnd_buffer_size也调调。

最后举个例子。

建表:
sql CREATE TABLE students ( id INT, name VARCHAR(1 0), grade INT, score INT );
建索引:
sql CREATE INDEX idx_grade_score ON students (grade, score);
查:
sql SELECT id, name, grade, score FROM students ORDER BY grade ASC, score DESC;
再用EXPLAIN看。

最好type是index或range。

Extra里没有Using filesort。

这样就行。

总结一下。

多字段排序:
先左后右。

索引很重要。

别用filesort。

字段选好。

NULL可以改。

EXPLAIN用起来。

配置可以调。

这样效率高。

你看着办。

mysql中ORDER BY语句的使用

那天,我在咖啡馆里,看到一位老朋友坐在角落里,正低头摆弄手机。
他突然抬起头,皱着眉头,似乎在思考什么问题。
等等,我想起来了,他是个程序员,可能是在处理数据库查询。

我走过去,他抬头看见我,苦笑着说:“哎,你不懂,这ORDER BY的事,简直让我头疼。
”我好奇地问:“怎么了?ORDER BY哪点让你不舒服了?”他叹了口气:“比如,这个查询,我按年龄排序,还按成绩降序,可就是不出结果,你说是不是哪里搞错了?”
我接过手机,看到他的查询语句:“SELECT FROM students ORDER BY age, score DESC;”我看了看,然后说:“你这里的ORDER BY没问题啊,先按age升序,age相同再按score降序,没问题啊。

他挠了挠头:“是啊,可问题就在于这个age相同的情况,成绩高的排前面,成绩低的后排,可就是没有按这个顺序排出来,我怀疑是不是SQL语法的问题。

我笑了笑:“这应该是数据库的排序逻辑问题,MySQL默认NULL值是最小值,所以如果有NULL值,成绩为NULL的学生会排在最前面,即使他们的年龄比其他学生大。

他恍然大悟:“哦,原来是这样,我之前没注意到这一点。
那有没有什么办法可以解决这个问题?”
我回答:“你可以先排除掉成绩为NULL的记录,再进行排序。
比如这样:SELECT FROM students WHERE score IS NOT NULL ORDER BY age, score DESC;”
他试试看,果然有效。
他抬头看了看我,感激地说:“谢谢你,你真是个救星!”
我笑了笑,心里想着:ORDER BY虽小,但搞懂了,生活和工作都能轻松不少。
等等,还有个事,我突然想到,优化性能的时候,别忘了建立索引哦。