`
jedy
  • 浏览: 147726 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

MySQL的 select 和 sort 变量

阅读更多
总是会忘记 status 中 Select% 的那几个变量的具体含义,这次干脆写下来以便日后查询。
主要有这9个变量。
1. Select_scan
2. Select_range
3. Select_full_join
4. Select_range_check
5. Select_full_range_join
6. Sort_scan
7. Sort_range
8. Sort_merge_passes
9. Sort_rows
其中 Select_scan 和 Select_range 包括了单表查询和多表联接查询中的第一个表。Select_full_join, Select_range_check 和 Select_full_range_join 用于多表联接查询中的第二张及之后的表。Sort 的那几个变量则用于任何需要排序的查询。

Select_scan
代表了需要做全表扫描。在 explain 中 type 会显示为 ALL,原因是查询没有能用到索引。因为全表扫描一般比较慢,所以应该尽量避免。

Select_range
代表需要从硬盘读表在一段范围内的行。在 explain 中显示为 range,说明使用了索引查找记录在硬盘上的位置。

Select_full_join
和 Select_scan 差不多,区别是 Select_full_join 代表的是第二张及之后的表。explain 中的类型也是 ALL,原因是表联接所用的字段上没有索引。它对性能有更为严重的影响,绝对要避免,所以用于联接的字段上一般都要加索引。

Select_range_check
这个比 Select_full_join 要好一点,和 Select_range 差不多。区别是 MySQL 不能确定它是否能否使用一个范围来做联接。如果可以那么会使用范围,如果不行仍会使用全表扫描。在 explain 中 type 也会是 ALL,但 extra 中会有 Range checked for each record (index map: ) 的说明。不能肯定是否能用范围是因为联接是条件不确定。如:
SELECT * FROM tbl1, tbl2 WHERE tbl1.col1 > tbl2.col1
如果 tbl2.col1 上有索引,那么可以做 Select_range_check,explain的结果如下
   mysql> EXPLAIN SELECT * FROM tbl1, tbl2 WHERE tbl1.col1 > tbl2.col1;
+-------------+-------+------+---------------+------+---------+------+------+------------------------------------------------+
| select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+-------------+-------+------+---------------+------+---------+------+------+------------------------------------------------+
| SIMPLE | tbl1 | ALL | NULL | NULL | NULL | NULL | 27 | |
| SIMPLE | tbl2 | ALL | col1 | NULL | NULL | NULL | 18 | Range checked for each record (index map: 0x1) |
+-------------+-------+------+---------------+------+---------+------+------+------------------------------------------------+

如果链接 tbl2 的时候 MySQL 判断可以使用范围查找,它仍然会增加 Select_range_check 而不是 Select_range。

Select_full_range_join
和 Select_range_check 类似,不过 MySQL 可以肯定它能够使用范围查找。这时 explain 中的类型是 range。这是联接中最好的情况。

Sort_scan 和 Sort_range
查询做排序,不论是因为 order by 还是 group by(除了使用了 order by NULL 的 group by),主要都是下面的三步:
1. 通过 where 条件找到记录
2. 排序
3. 按排好的顺序读取记录
如果第二步不被跳过,那么第三步中就会有 Sort_scan 或 Sort_range。如果第一步是 Select_scan,那么第三步将是 Sort_scan,如果第一步是 Select_range,那么第三步会是 Sort_range。但 Sort_scan 和 Sort_range 其实没有功能上的区别,都是将需要的记录按顺序读出来,所以性能也是一样的。

Sort_merge_passes
Sort_merge_passes 包括两步。MySQL 首先会尝试在内存中做排序,使用的内存大小由系统变量 Sort_buffer_size 决定,如果它的大小不够把所有的记录都读到内存中,MySQL 就会把每次在内存中排序的结果存到临时文件中,等 MySQL 找到所有记录之后,再把临时文件中的记录做一次排序。这再次排序就会增加 Sort_merge_passes。实际上,MySQL 会用另一个临时文件来存再次排序的结果,所以通常会看到 Sort_merge_passes 增加的数值是建临时文件数的两倍。因为用到了临时文件,所以速度可能会比较慢,增加 Sort_buffer_size 会减少 Sort_merge_passes 和 创建临时文件的次数。但盲目的增加 Sort_buffer_size 并不一定能提高速度,见 How fast can you sort data with MySQL ?

Sort_row
这代表了在第二步中被排序的记录的总数。因为 Sort_range 和 Sort_scan 是一样的,所以这个值只是说明了有多少记录被排序,意思不大。
分享到:
评论
1 楼 lixia0417 2011-08-27  
不错,但是mysql中的range表示的意义好像有点笼统,比如In(1,3)这样,它也认为是range。

相关推荐

    MySQL8.0优化Hint-在SQL中修改会话变量.pdf

    1. 查询之前的系统变量:`mysql> select @@optimizer_switch;` 2. 备份系统变量:`mysql> set @old_optimizer_switch = @@optimizer_switch;` 3. 设置新的变量:`mysql> set optimizer_switch='index_merge=off';` 4...

    MySQL不停地自动重启的解决方法

    比如,增大`key_buffer_size`、`read_buffer_size`和`sort_buffer_size`等内存参数,或者限制`max_connections`和`max_threads`,防止过多的连接和线程消耗资源。 5. **检查数据一致性**: 使用`mysqldump --all-...

    第2章 MySQL的语法基础(学生实验).pdf

    在本章实验“MySQL的语法基础”中,我们主要探讨了MySQL中的数据类型、数据类型的转换、表达式和数据类型转换的使用,以及用户变量和系统变量的定义与引用。 首先,实验一主要关注MySQL的基本数据类型及其取值范围...

    mysql数据库my.cnf配置文件

    #MySQL的查询缓冲大小(从4.0.1开始,MySQL提供了查询缓冲机制)使用查询缓冲,MySQL将SELECT语句和查询结果存放在缓冲区中, # 今后对于同样的SELECT语句(区分大小写),将直接从缓冲区中读取结果。根据MySQL用户...

    mysql_proc_page_order.zip_page_proc_page_排序MYSQL

    在MySQL 8.0版本之前,没有内置的ROW_NUMBER函数,但可以通过自连接和变量来模拟。以下是一个简单的例子: ```sql DELIMITER // CREATE PROCEDURE GetPagedData(IN page INT, IN pageSize INT, IN sortCol VARCHAR...

    mysql性能优化-慢查询分析、优化索引和配置.doc

    - `mysqladmin variables` 和 `mysqladmin extended-status`:在命令行中显示MySQL的系统变量和状态信息。 - **慢查询日志**:慢查询日志是一种非常有用的工具,用于记录执行时间过长的SQL语句。通过分析这些慢...

    Mysql+Maxscale2.0读写分离

    修改`/etc/profile`添加MySQL路径到环境变量: ```bash export PATH=$PATH:/usr/local/mysql/bin ``` 配置MySQL主服务器(Master)的`/etc/my.cnf`文件: ```ini [mysqld] port=3306 server_id=22249 ...

    MySQL优化中的内存计算公式

    为了更好地监控MySQL的内存使用情况,可以通过执行以下SQL命令来查看相关变量的值: ```sql SHOW VARIABLES LIKE 'key_buffer_size'; SHOW VARIABLES LIKE 'query_cache_size'; SHOW VARIABLES LIKE 'tmp_table_...

    MySQL配置文件mysql.ini参数详解.docx

    ### MySQL配置文件mysql.ini参数详解 #### 概述 MySQL是一种广泛使用的开源关系型数据库管理系统。...因此,在实际部署MySQL时,应当根据具体的应用场景和需求,仔细调整各项配置参数,以达到最佳效果。

    mysql优化

    不同的存储引擎具有不同的特点和适用场景,选择合适的存储引擎对于优化MySQL性能至关重要。 **1. MyISAM** - **特性** - 不支持事务处理,数据完整性无法得到保障。 - 提供高速的存储和检索,适用于读取密集型的...

    mysql ocp 5.6_SKY基于肖恩和ryanxu整理并添加部分解析 20160706.docx

    18. **mysqldump权限需求**:执行mysqldump备份通常需要SELECT、LOCK TABLES和RELOAD权限,至少要能读取要备份的表并锁定它们以防止其他更改。 以上是MySQL OCP 5.6考试中涉及的一些关键知识点,包括存储引擎、分区...

    聊聊MySQL中的参数

    在MySQL中,系统变量分为全局系统变量(global)和会话系统变量(session)。全局变量对整个服务器实例生效,而会话变量则局限于特定客户端的连接。 全局系统变量在MySQL服务启动时通过配置文件或命令行选项设定,...

    mysql面试题.docx

    14. sort_buffer_size 影响排序操作,修改全局变量 `SET GLOBAL sort_buffer_size=value`。 15. 清理 binlog:`PURGE BINARY LOGS BEFORE NOW();` 16. Binlog 模式有 ROW、STATEMENT、MIXED,ROW 最安全,STATEMENT ...

    Mysql row number()排序函数的用法和注意

    总的来说,尽管MySQL没有内置的`ROW_NUMBER()`函数,但通过变量赋值和控制变量的初始化,我们可以实现类似的功能。同时,理解其他排序函数如`GROUP_CONCAT()`和`FIELD()`等,可以帮助我们在处理数据排序时有更多的...

    将MySQL去重操作优化到极致的操作方法

    3. **利用变量和临时表** 另一种优化方法是先创建一个临时表,存储每个唯一`created_time`和`item_name`组合的最小`item_id`,然后再将这些记录插入目标表: ```sql CREATE TEMPORARY TABLE temp_table AS ...

    MySQL ORDER BY 的实现分析

    例如,在表A和B上执行的查询`SELECT A.* FROM A, B WHERE A.c1 > 2 AND A.c2 ,通过EXPLAIN计划可以看到,MySQL并未执行实际的排序操作,而是直接利用了索引顺序。 2. **内存中的排序算法(filesort)**: 当无法...

    国家开放大学4046数据库运维考试资料精简版.doc

    25. 可更新的视图可以支持某些类型的更新操作,例如`CREATE VIEW book_view (a_sort, a_book) AS SELECT sort, books, COUNT(name) FROM tb_book;`。 26. 并行索引并不是MySQL中的标准索引类型,常见的索引类型有B...

    国家开放大学.doc4046数据库运维考试资料精简版.doc

    23. **可更新视图**:如果视图的定义允许某些类型的更新操作,如创建视图`CREATE VIEW book_view (a_sort, a_book) AS SELECT sort, books, COUNT(name) FROM tb_book;`,那么视图是可更新的。 24. **非标准索引...

Global site tag (gtag.js) - Google Analytics