mysql排序主要针对order by指令,本篇主要介绍mysql是如何进行排序以及性能优化的。我们从全字段排序和rowid排序两种排序方式介绍,当然这两种排序都基于基本的排序算法,归并排序。归并排序主要应用于大文件排序,内存有限的情况下,先将文件分为多个有序的小文件,然后将小文件进行排序,时间复杂度nlogn,当然文件的存储形式还有io的时间消耗,这也是数据库性能优化的主要目标,尽量减少磁盘io。
1 | CREATE TABLE `words` ( |
全字段排序 vs rowId排序
顾名思义,全字段排序的意思是将记录的所有行都放到内存中进行排序,排序成功之后取固定的字段或者数量返回给客户端。mysql将所有的排序记录都优先考虑放在内存中,我们通过查询指令可以查到配置:
1 | -- sql query |
排序的过程如下:
analyze table 命令
检测和重组表的关键字分布情况。用来分析和存储表的关键字的分布,使得系统获得准确的统计信息。在执行查询计划的时候可能会错误估计要扫描的条数,导致应用不到索引,通过analyze table命令可以使估计值更加准确。
1 | analyze table table_name;//analyze+表名 |