简介春节前一个悠闲的早晨,小航送给我一袋坚果。他见我吃得香香的,慢条斯理地问:“文哥,mysql的排序有没有什么需要注意的,不就是前排和后排吗?”听到他的问题,我觉得果仁不香,但是为了技术(mainzi),我故作高手说:“前前后后,当然不是全部,你至少要知道,2个参数,1个优化,一个特例”注意:东西不能乱吃。sort_buffer_size两个核心参数决定了内行和外行。内排是到内存,外排是用归并排序到磁盘。max_length_for_sort_data决定是按所有字段排序还是按rowid排序。所有字段的排序字段都放在sort_buffer中,查询结果排序后直接从内存中返回。rowid和排序字段存储在Rowid排序中。排序后,从数据库中找到数据,拼接返回。优化方法覆盖索引覆盖索引是指索引上的信息足以满足查询请求,不需要再回到主键索引取数据。另外,MySQL系列面试题和答案都整理好了。微信搜索Java技术栈,后台发送:面试,网上可以看。例子explainSELECTorder_id,pay_dateFROMorders_detailWHEREorder_id='1001'ORDERBYpay_dateasc使用filesort,即需要排序。《MySQL 开发的 36 条军规》推荐观看。调整索引ALTERTABLE`orders_detail`DROPINDEX`order_id`,ADDINDEX`order_id`(`order_id`,`pay_date`);然后解释SELECTorder_id,pay_dateFROMorders_detailWHEREorder_id='1001'ORDERBYpay_dateasc没有使用filesort,因为复合索引,字段是有序的。在特殊情况下,Orderby+LimitLimit可能会使用优先队列排序算法。示例:1.启用优化跟踪SETOPTIMIZER_TRACE="enabled=on",END_MARKERS_IN_JSON=off;SEToptimizer_trace_offset=-30,optimizer_trace_limit=30;2.查看字段索引SHOWINDEXFROMoc_order_onlineWHERECOLUMN_NAME='order_name';结果显示没有索引3.执行orderby+limit查询语句select*from`oc_order_online`orderby`order_name`limit204.查询优化跟踪信息SELECT*FROMINFORMATION_SCHEMA.OPTIMIZER_TRACElimit30对应结果如下:Querypastethedatain红框去json.cn查看格式化后的数据,有如下片段filesort_priority_queue_optimization选中的:true表示使用优先级队列排序。另外,关注公众号Java技术栈,后台回复:面试,可以拿到我整理的Java系列面试题及答案,很全。总结sort_buffer_size决定内行,外行max_length_for_sort_data决定全字段排序还是rowid排序覆盖索引是一种优化方式限制可能涉及到优先队列排序
