课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
数据库的开发是大多数后端编程开发程序员都需要熟练掌握的一个编程技术,而今天我们就通过案例分析来了解一下,数据库索引优化orderby优化包含哪些内容。
当查询语句中使用 order by 进行排序时,如果没有使用索引进行排序,会出现 filesort 文件内排序,这种情况在数据量大或者并发高的时候,会有性能问题,需要优化。
filesort 出现的情况举例
order by 字段不是索引字段
order by 字段是索引字段,但是 select 中没有使用覆盖索引,如:select * from staffs order by age asc;
order by 中同时存在 ASC 升序排序和 DESC 降序排序,如:select a, b from staffs order by a desc, b asc;
order by 多个字段排序时,不是按照索引顺序进行 order by,即不是按照左前缀法则,如:select a, b from staffs order by b asc, a asc;
索引层面解决方法
使用主键索引排序
按照左前缀法则,并且使用覆盖索引排序,多个字段排序时,保持排序方向一致
在 SQL 语句中强制指定使用某索引,force index(索引名字)
不在数据库中排序,在代码层面排序
order by 排序算法
双路排序Mysql4.1 之前是使用双路排序,字面的意思就是两次扫描磁盘,终得到数据,读取行指针和 ORDER BY 列,对他们进行排序,然后扫描已经排好序的列表,按照列表中的值重新从列表中读取对数据输出。也就是从磁盘读取排序字段,在 buffer 进行排序,再从磁盘读取其他字段。
文件的磁盘 IO 非常耗时的,所以在 Mysql4.1 之后,出现了二种算法,就是单路排序。
单路排序从磁盘读取查询需要的所有列,按照 orderby 列在 buffer 对它们进行排序,然后扫描排序后的列表进行输出, 它的效率更快一些,避免了二次读取数据,并且把随机 IO 变成顺序 IO,但是它会使用更多的空间, 因为它把每一行都保存在内存中了。
当我们无可避免要使用排序时,索引层面没法在优化的时候又该怎么办呢?尽可能让 MySQL 选择使用二种单路算法来进行排序。这样可以减少大量的随机 IO 操作,很大幅度地提高排序工作的效率。下面看看单路排序优化需要注意的点
单路排序优化点
增大 max_length_for_sort_data
去掉不必要的返回字段,避免select *
增大 sort_buffer_size 参数设置
但是sort_buffer_size 不是越大越好:
Sort_Buffer_Size 是一个 connection 级参数,在每个 connection 一次需要使用这个 buffer 的时候,一次性分配设置的内存。
Sort_Buffer_Size 并不是越大越好,由于是 connection 级的参数,过大的设置和高并发可能会耗尽系统内存资源。
据说 Sort_Buffer_Size 超过 2M 的时候,就会使用 mmap() 而不是 malloc() 来进行内存分配,导致效率降低。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请在707945861群中学习了解。