8.2.1.15 ORDER BY Optimization ORDER BY 优化
8.2.1.15 ORDER BY Optimization ORDER BY 优化 在一些情况下, MySQL 可以使用一个索引来满足一个ORDER BY 子句不需要做额外的排序 index 可以用于即使ORDER BY 不精确的匹配index, 只要所有未使用的索引的部分和所有额外的ORDER BY 列是WHERE 子句中的常量。 下面的查询使用index来解决ORDER BY 部分: SELECT * FROM t1
ORDER BY key_part1,key_part2,... ; SELECT * FROM t1
WHERE key_part1 = constant
ORDER BY key_part2; SELECT * FROM t1
ORDER BY key_part1 DESC, key_part2 DESC; SELECT * FROM t1
WHERE key_part1 = 1
ORDER BY key_part1 DESC, key_part2 DESC; SELECT * FROM t1
WHERE key_part1 > constant
ORDER BY key_part1 ASC; SELECT * FROM t1
WHERE key_part1 < constant
ORDER BY key_part1 DESC; SELECT * FROM t1
WHERE key_part1 = constant1 AND key_part2 > constant2
ORDER BY key_part2; 在一些情况下, MySQL 不能使用indexes来解决ORDER BY,尽管它仍旧使用索引来找到匹配的记录。 例如如下: 1. 查看使用ORDER BY 在不同的索引上: SELECT * FROM t1 ORDER BY key1, key2; 2.查询使用ORDER BY 在一个索引非连续的部分 SELECT * FROM t1 WHERE key2=constant ORDER BY key_part2; 3.查询混合ASC和DESC SELECT * FROM t1 ORDER BY key_part1 DESC, key_part2 ASC; 4.index 用于获取记录不同于一个用于ORDER BY SELECT * FROM t1 WHERE key2=constant ORDER BY key1; 5.查询使用ORDER BY 使用一个表达式 包含条件除index列以外 SELECT * FROM t1 ORDER BY ABS(key);
SELECT * FROM t1 ORDER BY -key; 6.查询关联很多表, 列在ORDER BY 不是所有从第一个非常量表来检索记录 7.查询有不同的ORDER BY 和GROUP BY 表达式 8. 有一个索引只有前缀列命名在ORDER BY 子句,在这种情况下, index 不能被完全使用来解决排序顺序。 如果 如果 只有一个CHAR(20) 的前10个字节被索引, 一个索引的可利用性对于排序可能是有影响的通过使用列的别名,假设 列t1.a是索引的。 在这种情况下, 列的名字在选择的list 是a.it 它指向t1.a 索引可以被使用 SELECT a FROM t1 ORDER BY a; 在这个语句, 列的名字在select list 是a, 但是它是alias的名字。它指向ABS(a), 因此指向a 在ORDER BY,索引不能被使用 SELECT ABS(a) AS a FROM t1 ORDER BY a; 在下面的语句,ORDER BY 指向一个名字 不是列的名字在SELECT 列表。 但是有一个列在t1叫做a,因此 ORDER BY 使用 索引可以被使用(排序顺序可能是不同的) SELECT ABS(a) AS b FROM t1 ORDER BY a; 默认, MYSQL 排序所有的GROUP BY col1,col2 查询如果你指定ORDER BY col1,col2, 如果你包含一个显示的ORDER BY 子句 包含相同的列集合 注意: 如果一个查询包含 GROUP BY 但是你需要避免 排序结果的开销,你可以指定排序通过ORDER BY NULL INSERT INTO foo
SELECT a, COUNT(*) FROM bar GROUP BY a ORDER BY NULL; 使用EXPLAIN SELECT ... ORDER BY,你可以检查是否 MySQL 使用索引来查询。 它不能?你使用filesort 在额外的列 mysql> explain select * from Client order by sn
-> ;
+----+-------------+--------+-------+---------------+---------+---------+------+------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+--------+-------+---------------+---------+---------+------+------+-------+
| 1 | SIMPLE | Client | index | NULL | PRIMARY | 4 | NULL | 5884 | NULL |
+----+-------------+--------+-------+---------------+---------+---------+------+------+-------+
1 row in set (0.03 sec) mysql> explain select * from Client order by status;
+----+-------------+--------+------+---------------+------+---------+------+------+----------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+--------+------+---------------+------+---------+------+------+----------------+
| 1 | SIMPLE | Client | ALL | NULL | NULL | NULL | NULL | 5884 | Using filesort |
+----+-------------+--------+------+---------------+------+---------+------+------+----------------+
1 row in set (0.00 sec) MySQL 有2种 filesort 算法用于排序和检索记录。 原始方法只使用ORDER BY 列, 修改方法不只是使用ORDER BY 列, 而是查询涉及的所有列 优化器选择文件排序算法使用,它通常使用修改算法除了当BLOB或者TEXT 列被设计, 在这种情况下它会使用原始的算法。对于两种算法, sort buffer size 是sort_buffer_size 系统变量控制的 [root@zjzc01 binlog]# cat /etc/my.cnf | grep sort
sort_buffer_size=1M 原始的filesort 算法如下: 1. 读取所有的记录根据索引或者通过表扫描,跳过不匹配的记录 2. 对于每条记录, 存储在sort buffer 一个元组有一对值组成(sort key 值和row ID) 3.如果所有的pairs 到放到sort buffer, 不需要创建临时文件。否则, 当sort buffer 变满时, 运行一个qsort(quicksort) 在内存里 写到一个临时文件,保存一个指向排序后的块 4.重复前面的步骤, 知道所有行被读取 5.做一个 合并到 MERGEBUFF (7) 区域到一个block在另外的temporary 文件。 重复知道所有的blocks 从第一个文件是在第2个文件 6.重复下面知道有较少相比 MERGEBUFF2 (15)块留下 7. 在最后的合并,只有row ID (值对的最后部分)是写入到结果文件 8. 读按顺序存储的记录使用row IDs 在结果文件。 优化这个, 读取row IDs的大的块,排序它们,使用它们读取排序的记录到row buffer. row buffer size 是 read_rnd_buffer_size 系统变量设置 一个问题是它会读取量词, 一次在where 条件评估时, 另外一次在排序值对后。 修改的filesort 算法采用一个优化的来避免读2次, 它记录仪sort key 值,代替row ID 它记录查询涉及的列, 修改后的文件排序算法工作如下: 1.读取匹配WHERE 子句的记录 2.对于每个行, 存储在sort buffer 一个元组 有sort key值和查询涉及的列组成 3.当排序区变满后, sort 元组通过sort key 值在内存里写到一个临时文件 mysql> show variables like '%sort%';
+--------------------------------+---------------------+
| Variable_name | Value |
+--------------------------------+---------------------+
| innodb_disable_sort_file_cache | OFF |
| innodb_ft_sort_pll_degree | 2 |
| innodb_sort_buffer_size | 1048576 |
| max_length_for_sort_data | 1024 |
| max_sort_length | 1024 |
| myisam_max_sort_file_size | 9223372036853727232 |
| myisam_sort_buffer_size | 8388608 |
| sort_buffer_size | 1048576 |
+--------------------------------+---------------------+
8 rows in set (0.00 sec)
8.2.1.15 ORDER BY Optimization ORDER BY 优化的更多相关文章
- MYSQL ORDER BY Optimization
ORDER BY Optimization 某些情况下,MYSQL可以使用index排序而避免额外的sorting. 即使order by语句列不能准确的匹配index,只要没有index中(不在or ...
- 8.2.1.4 Index Merge Optimization 索引合并优化:
8.2.1.4 Index Merge Optimization 索引合并优化: 索引合并方法是用于检索记录 使用多个 范围扫描和合并它们的结果集到一起 mysql> show index fr ...
- MySQL高级 之 order by、group by 优化
参考: https://blog.csdn.net/wuseyukui/article/details/72627667 order by示例 示例数据: Case 1 Case 2 Case 3 ...
- OPEN A PO ORDER OR SO ORDER
OPEN PO ORDER fnd_function.Execute(Function_Name => 'PO_POXPOEPO', Open_Flag => 'Y', Session_F ...
- SQL sqlserver order by 1,order by 后面直接加数字,多个字段排序
①select * from table order by n 表示select里面的第n个字段 ②多个字段排序
- linux下order by 报出ORDER BY clause is not in SELECT list
一.问题: 在程序执行查询的时候,order by 不能找到要排序的列 二.解决: 在linux环境下,程序之前连接其他库可以正常运行,但是换了一个库后数据就不能正常的显示了,查看后台报出排序列找不到 ...
- Android进阶笔记15:ListView篇之图片优化
1.图片异步加载: (1)处理图片的方式: 如果ListView中自定义的Item中有涉及到大量图片的,一定要对图片进行细心的处理,因为图片占的内存是 ListView 项中最头疼的,处理图片的方法大 ...
- Mysql优化(出自官方文档) - 第四篇
Mysql优化(出自官方文档) - 第四篇 目录 Mysql优化(出自官方文档) - 第四篇 1 Condition Filtering 2 Constant-Folding Optimization ...
- SORT UNIQUE|AGGREGATE|GROUP BY|ORDER BY|JOIN
相信做oracle开发和管理的朋友对sort肯定不会陌生,大家通常都遇到这样那样的排序性能问题,所以我写这一系列关于sort的文章告诉大家在oracle里面sort是怎么一回事以及如果调整sort获得 ...
随机推荐
- ceph主要数据结构解析2-Rados.h文件
(1)文件系统id结构:16个字符组成 struct ceph_fsid { unsigned char fsid[16]; }; 以及对应的比较函数: static inline int ceph_ ...
- DecimalFormat用法
DecimalFormat用法 DecimalFormat 是 NumberFormat 的一个具体子类,用于格式化十进制数字. DecimalFormat 包含一个模式 和一组符号 符号含义: ...
- 安装android studio 出现的路径问题 tools.jar' seems to be not in Android Studio classpath
尝试一下android studio ,谁知出现路径问题 'tools.jar' seems to be not in Android Studio classpath. Please ensure ...
- codevs 2494 Vani和Cl2捉迷藏
/* 一开始大意了 以为和bzoj上的祭祀是一样的(毕竟样例都一样) 这里不知相邻的点可以相互到达 间接相连的也可以到达 所以floyed先建立一下关系 再跑最大独立集 下面贴一下95 和 100的代 ...
- 项目中用到的input 遇到的问题的归类
input 前几天 为了这个词 用在搜索框被我们总监喷,为了加强印象,我把它记录下来 最原始的造型 <input type="text" value="搜索&quo ...
- UFLDL课程学习(二)
章节地址:http://ufldl.stanford.edu/tutorial/supervised/LogisticRegression/ 章节名称:逻辑回归 (Logisitic Regressi ...
- zookeeper笔记
zookeeper用于分布式配置管理,读写锁等等..后续补充.
- 'swap file "xx" exists' linux
solution: 1)swap to another tty, kill processes using 'sudo kill -9 pid' 2)'Recover' the 'warn-openn ...
- Nagios监控memcached
下载地址: http://search.cpan.org/CPAN/authors/id/Z/ZI/ZIGOROU/Nagios-Plugins-Memcached-0.02.tar.gz http: ...
- Fiddler 网页采集抓包利器
最近这段时间,网页采集方面的工作做得比较多.用curl技术开发了一个微信文章聚合类产品,把抓取到的数据转换成json格式,并在android端调用json数据接口加以显示:基于weiphp做了一个掌上 ...