`
骑猪逛街666
  • 浏览: 141506 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

[MySQL 优化] --order by 原理

阅读更多
阅读原文请点击:http://click.aliyun.com/m/23627/
摘要: 一、简介: 大部分查询中都要使用到order by。那么处理排序的方法有两种:一种是使用索引,另外一种则是查询时候使用Filesort处理。 ****1. 利用索引进行排: **** 利用有序索引进行排序,当 Query ORDER BY 条件和 Query 的执行计划中所利用的 Index 的索引键完全一致,且索引访问方式为 rang、 ref 或者 index 的时候,MySQL 可以利用索引顺序而直接取得已经排好序的数据。

一、简介:
大部分查询中都要使用到order by。那么处理排序的方法有两种:一种是使用索引,另外一种则是查询时候使用Filesort处理。

****1. 利用索引进行排: ****
利用有序索引进行排序,当 Query ORDER BY 条件和 Query 的执行计划中所利用的 Index 的索引键完全一致,且索引访问方式为 rang、 ref 或者 index 的时候,MySQL 可以利用索引顺序而直接取得已经排好序的数据。因为 MySQL 不需要进行实际的排序操作
2. 利用内存或者磁盘排序算法:
1. single pass
1. two pass

优缺点对比
优点 缺点
使用索引 执行insert,update,delete查询时,索引已经排序好,只需要依次读取即可,处理速度快
使用Filesort 1.因不必创建索引,故无使用索引时那么多的缺点 2.若要排序的记录不多,在内存中进行Filesort处理,速度也非常快
不能使用索引进行排序的场景:###
排序的基准太多,无法依据某个基准创建索引
要对group by 的结果或者DISTINCT的结果进行排序时
对临时表的结果(union union all[5.7进行优化没有临时表的出现])重新排序时
二、 举例:
表结构:

5.7@3306>[employees]>show create table employees\G
*************************** 1. row ***************************
       Table: employees
Create Table: CREATE TABLE `employees` (
  `emp_no` int(11) NOT NULL,
  `birth_date` date NOT NULL,
  `first_name` varchar(14) NOT NULL,
  `last_name` varchar(16) NOT NULL,
  `gender` enum('M','F') NOT NULL,
  `hire_date` date NOT NULL,
  PRIMARY KEY (`emp_no`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

1.使用索引进行排序:

5.7@3306>[employees]>desc select emp_no,first_name, last_name from employees order by emp_no desc limit 0,10;
+----+-------------+-----------+------------+-------+---------------+---------+---------+------+------+----------+-------+
| id | select_type | table     | partitions | type  | possible_keys | key     | key_len | ref  | rows | filtered | Extra |
+----+-------------+-----------+------------+-------+---------------+---------+---------+------+------+----------+-------+
|  1 | SIMPLE      | employees | NULL       | index | NULL          | PRIMARY | 4       | NULL |   10 |   100.00 | NULL  |
+----+-------------+-----------+------------+-------+---------------+---------+---------+------+------+----------+-------+

2.使用single pass:

5.7@3306>[employees]>show status like '%sort%';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| Sort_merge_passes | 0     |
| Sort_range        | 0     |
| Sort_rows         | 0     |
| Sort_scan         | 0     |
+-------------------+-------+
4 rows in set (0.00 sec)

5.7@3306>[employees]>select emp_no,first_name, last_name from employees order by first_name limit 100;
分析:将select的列,order 列放入到排序缓冲,进行排序处理,排序完成后,直接将排序缓冲中的内容返回。

5.7@3306>[employees]>show status like '%sort%';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| Sort_merge_passes | 0     |
| Sort_range        | 0     |
| Sort_rows         | 100   |
| Sort_scan         | 1     |
+-------------------+-------+
4 rows in set (0.00 sec)

5.7@3306>[employees]>desc  select emp_no,first_name, last_name from employees order by first_name limit 100;
+----+-------------+-----------+------------+------+---------------+------+---------+------+--------+----------+----------------+
| id | select_type | table     | partitions | type | possible_keys | key  | key_len | ref  | rows   | filtered | Extra          |
+----+-------------+-----------+------------+------+---------------+------+---------+------+--------+----------+----------------+
|  1 | SIMPLE      | employees | NULL       | ALL  | NULL          | NULL | NULL    | NULL | 299423 |   100.00 | Using filesort |
+----+-------------+-----------+------------+------+---------------+------+---------+------+--------+----------+----------------+
1 row in set, 1 warning (0.00 sec)

那么这样会造成什么问题:IO,网络等

3.Two pass

5.7@3306>[employees]>show variables like "%max_length%";
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| max_length_for_sort_data | 1024  |
+--------------------------+-------+
1 row in set (0.00 sec)
排序的值需要大于上面的值

5.7@3306>[employees]>show status like '%sort%';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| Sort_merge_passes | 0     |
| Sort_range        | 0     |
| Sort_rows         | 0     |
| Sort_scan         | 0     |
+-------------------+-------+
4 rows in set (0.00 sec)

5.7@3306>[employees]> select count(1) from ( select * from employees order by first_name desc limit 100000000 ) a; 
+----------+
| count(1) |
+----------+
|   300024 |
+----------+
1 row in set (0.87 sec)

5.7@3306>[employees]>show status like '%sort%';
+-------------------+--------+
| Variable_name     | Value  |
+-------------------+--------+
| Sort_merge_passes | 25     |
| Sort_range        | 0      |
| Sort_rows         | 300024 |
| Sort_scan         | 1      |
+-------------------+--------+
4 rows in set (0.00 sec)
解释:Sort_merge_passes  超出sort buffer的值,将数据写入到了tmp file中
三、 优化filesort:
优先选择第一种using index 的排序方式,在第一种方式无法满足的情况下,尽可能让 MySQL 选择使用第二种单路算法来进行排序。这样可以减少大量的随机IO操作,很大幅度地提高排序工作的效率。
1、去掉不必要的字段
2、加大max_length_for_sort_data 参数的设置
3、增大sort buffer的设置
阅读原文请点击:http://click.aliyun.com/m/23627/
分享到:
评论

相关推荐

    mysql性能优化教程.pdf (by caoz)

    SELECT * FROM user WHERE area = '$area' AND sex = '$sex' ORDER BY lastlogin DESC LIMIT 0, 30; ``` - **解决方案**:创建`area + sex + lastlogin`的复合索引,这样可以同时利用地区和性别筛选结果,并按...

    【mysql知识点整理】— order by 、group by 出现Using filesort原因详解

    MySQL中的`ORDER BY`和`GROUP BY`是SQL查询中两个关键的子句,它们用于对查询结果进行排序和分组。然而,在某些情况下,MySQL可能会使用`Using filesort`来完成这些操作,这通常会导致性能下降。本文将深入探讨`...

    mysql 优化 pdf

    - 使用LIMIT进行分页查询时,配合ORDER BY优化性能。 3. **存储引擎优化**: - InnoDB与MyISAM存储引擎的比较,包括事务处理、行级锁定、缓存机制等。 - 存储引擎的选择策略,根据业务需求来决定。 4. **内存...

    MySQL的or、in、union与索引优化

    SELECT * FROM order WHERE status IN (0, 1) ORDER BY date DESC; ``` 此查询可以利用`status`和`date`的索引来提高效率,特别是如果这两个字段都有索引的话。 4. **组合条件查询**: ``` SELECT * FROM ...

    MySQL优化篇:排序分组优化.pdf

    在优化order by排序时,首先应当尽量利用索引来实现排序,即使用index方式排序,避免使用FileSort方式排序。FileSort是MySQL在内存中临时排序的过程,当不能利用索引排序时,MySQL会进行文件排序,这会消耗大量的CPU...

    MySQL order by性能优化方法实例

    本文从原理以及优化层面介绍 order by 。 一 MySQL中order by的原理  1 利用索引的有序性获取有序数据  当查询语句的 order BY 条件和查询的执行计划中所利用的 Index 的索引键(或前面几个索引键)完全一致,且...

    大牛讲解的MySQL介绍及性能优化 PPT

    - 查询操作:SELECT语句的基本用法,包括WHERE子句、ORDER BY、GROUP BY和JOIN操作。 4. MySQL性能优化: - 索引优化:理解B-TREE、HASH索引的工作原理,何时使用全文索引,以及如何通过EXPLAIN分析查询性能。 -...

    mysql-8.0.26-winx64-免安装版.rar+安装教程

    例如,理解SQL语言,包括SELECT、INSERT、UPDATE、DELETE语句,以及JOIN、GROUP BY、ORDER BY等子句。此外,熟悉数据库设计原则,如范式理论,有助于创建高效、稳定的数据库结构。对于进阶用户,了解存储引擎(如...

    mysql数据库query的优化

    对于GROUP BY和ORDER BY,尽量使用索引字段,这样可以利用索引排序,提高查询速度。同时,避免在这些操作中使用非索引字段,尤其是大字段,如TEXT或BLOB类型,这会增加计算和内存消耗。 在数据库设计层面,遵循第一...

    Mysql优化order by语句的方法详解

    MySQL数据库中,ORDER BY语句用于对查询结果进行排序,其优化对于提升查询性能至关重要。在深入了解优化方法之前,理解索引的工作原理是基础。索引是数据库管理系统中用于加速查询的一种数据结构,通常采用B+树的...

    mysql_Query优化

    #### 六、ORDER BY、GROUP BY 和 DISTINCT 的优化 **6.1 ORDER BY 的优化** - **添加索引**: 为 ORDER BY 中的列添加索引。 - **限制结果集**: 使用 LIMIT 限制返回的结果数量。 - **避免使用复杂表达式**: 尽量...

    MySQL 5.1参考手册

    7.2.12. MySQL如何优化ORDER BY 7.2.13. MySQL如何优化GROUP BY 7.2.14. MySQL如何优化LIMIT 7.2.15. 如何避免表扫描 7.2.16. INSERT语句的速度 7.2.17. UPDATE语句的速度 7.2.18. DELETE语句的速度 7.2.19. 其它...

    《数据库原理及应用_MySQL》实验任务及指导书.docx

    *掌握使用 ORDER BY 子句对查询结果进行排序 *掌握使用 LIMIT 子句对查询结果进行分页 知识点4: MYSQL 数据库表的数据插入、修改、删除操作实验 *掌握使用 INSERT 语句对数据库表进行数据插入操作 *掌握使用 ...

    MySQL优化.pdf

    当然,数据库优化是核心话题,课程会详细阐述MySQL的索引原理,如何避免索引失效,以及一系列性能优化策略,如查询优化、表结构设计优化等。 通过这门课程,学员不仅能掌握MySQL的基础知识,还能了解到高级特性和...

    《MySQL数据库原理及应用》教案.rar.zip

    《MySQL数据库原理及应用》是一门深入探讨关系型数据库管理系统MySQL的课程,旨在教授学生如何有效地设计、管理和优化数据库。本教程将涵盖MySQL的基础概念、安装配置、SQL语言、数据库设计、事务处理、备份恢复、...

Global site tag (gtag.js) - Google Analytics