首页 » 网站推广 » phpmysqli排序技巧_聊聊MySQL是若何处理排序的

phpmysqli排序技巧_聊聊MySQL是若何处理排序的

访客 2024-12-09 0

扫一扫用手机浏览

文章目录 [+]

它们的相同点是都会对字段进行排序,那查询语句中的排序是如何实现的呢?

当利用的查询语句须要进行排序时有两种处理情形:

phpmysqli排序技巧_聊聊MySQL是若何处理排序的

当前记录本来便是有序的,不须要进行排序当前记录未保持顺序,须要排序利用索引担保有序

对付第一种情形,常常是利用二级索引中索引列的有序来担保结果集有序,从而不须要进行排序

phpmysqli排序技巧_聊聊MySQL是若何处理排序的
(图片来自网络侵删)

对付表a,为a2建立二级索引,那么在二级索引上a2便是有序的

CREATE TABLE `a` ( `a1` int(11) NOT NULL AUTO_INCREMENT, `a2` varchar(255) CHARACTER SET utf8mb4 DEFAULT NULL, `a3` varchar(255) DEFAULT NULL, PRIMARY KEY (`a1`), KEY `idx_a2` (`a2`) ) ENGINE=InnoDB AUTO_INCREMENT=76 DEFAULT CHARSET=utf8;

select from a order by a.a2 limit 10

当优化器选择利用a2索引时,a2列的记录本身便是有序的,因此不须要再利用其他开销进行排序

当然,优化器也有可能不该用a2索引(当优化器认为利用a2回表开销太大时会利用全表扫描)

当优化器利用的索引上a2无序时,则会通过其他手段对结果进行排序

filesort

当实行操持的Extra附加信息中涌现 Using filesort 时,会利用sort_buffer对结果进行排序

sort_buffer是一块用于排序的内存,sort_buffer可能存放查询须要的所有字段,也可能只存放须要排序的字段和主键

show variables like 'max_length_for_sort_data'

当查询须要的字段长度小于 max_length_for_sort_data 时,则会将查询须要的所有字段放入sort_buffer中,然后对须要排序的列进行排序,末了返回结果

当查询须要的字段长度大于 max_length_for_sort_data 时,只会将须要排序的字段和主键值放入sort_buffer中,等到排序后再去查询聚簇索引获取须要查询的列(相称于又多了一次回表)

在sort_buffer中进行排序时,如果内存足够则会在内存中进行排序,如果内存不足则会利用磁盘的临时文件来赞助排序

开启 optimizer_trace 可以查看是否利用临时文件赞助排序

#开启优化器追踪 SET optimizer_trace='enabled=on'; #sql语句 select from student order by student_name limit 10000; ​ #查看优化器追踪的信息 SELECT FROM `information_schema`.`OPTIMIZER_TRACE`\G;

排序利用的算法是归并算法,先分割成多个小文件排序再进行合并

个中number_of_tmp_files 为利用到的临时文件数量,sort_buffer_size 为sort_buffer大小

因此当利用order by、group by等须要排序的关键字时,最好建立得当的索引

如果数据量小可以在sort buffer中排序,如果数据量太大还须要与磁盘交互

总结

当查询语句须要排序时会分为不用排序和须要排序两种情形

当利用的索引有序时则不用再进行排序,通过索引来担保有序

当利用的索引无序时则会利用sort_buffer进行排序,当查询字段的长度未超过限定时,sort_buffer中每条记录会存储须要查询的列

如果超过限定,则sort_buffer只会存储须要排序的列和主键值,排序后再通过主键值进行回表获取须要查询的列

当数据量太大不足在内存中排序完,会利用磁盘页赞助排序,利用归并算法将排序数据分散在多个页再合并

可以通过追踪优化器 optimizer_trace 剖析内容查看赞助页的数量等信息

为须要排序的列建立得当的索引,避免利用磁盘页赞助排序

当无法利用索引时可以调度sort buffer 或 max_length_for_sort_data(谨慎)

关注#华为云开拓者同盟# 点击下方,第一韶光理解华为云新鲜技能~

华为云博客_大数据博客_AI博客_云打算博客_开拓者中央-华为云

标签:

相关文章

php常量率低技巧_PHP 常量详解教程

PHP 常量常量是单个值的标识符(名称)。在脚本中无法改变该值。有效的常量名以字符或下划线开头(常量名称前面没有 $ 符号)。注释...

网站推广 2024-12-19 阅读1 评论0