MySQL手册版本 5.0.20-MySQL优化(四) (1)

7.2.9 MySQL 如何优化 ORDER BY

在一些情况下,MySQL可以直接使用索引来满足一个 ORDER BY 或 GROUP BY 子句而无需做额外的排序。

尽管 ORDER BY 不是和索引的顺序准确匹配,索引还是可以被用到,只要不用的索引部分和所有的额外的 ORDER BY 字段在 WHERE 子句中都被包括了。下列的几个查询都会使用索引来解决 ORDER BY 或 GROUP BY 部分:

SELECT * FROM t1 ORDER BY key_part1,key_part2,... ;

SELECT * FROM t1 WHERE key_part1=constant ORDER BY key_part2;

SELECT * FROM t1 WHERE key_part1=constant GROUP 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;

在另一些情况下,MySQL无法使用索引来满足 ORDER BY,尽管它会使用索引来找到记录来匹配 WHERE 子句。这些情况如下:

对不同的索引键做 ORDER BY :

SELECT * FROM t1 ORDER BY key1, key2;

在非连续的索引键部分上做 ORDER BY:

SELECT * FROM t1 WHERE key2=constant ORDER BY key_part2;

同时使用了 ASC 和 DESC:

SELECT * FROM t1 ORDER BY key_part1 DESC, key_part2 ASC;

用于搜索记录的索引键和做 ORDER BY 的不是同一个:

SELECT * FROM t1 WHERE key2=constant ORDER BY key1;

有很多表一起做连接,而且读取的记录中在 ORDER BY 中的字段都不全是来自第一个非常数的表中(也就是说,在 EXPLAIN 分析的结果中的第一个表的连接类型不是 const)。

时间: 2024-10-26 05:12:51

MySQL手册版本 5.0.20-MySQL优化(四) (1)的相关文章

MySQL手册版本 5.0.20-MySQL同步(一)

mysql 6 MySQL 同步 同步功能在MySQL 3.23.15就开始引进了,它可以把一个MySQL服务器上的数据复制到另一个服务器上去.本章描述了MySQL的各种复制特性.介绍了同步的概念,如何设置同步服务器,以及可用服务器的参照.还提供了一系列的常见问题及其答案,疑难解答. "14.6 Replication Statements"中介绍了同步相关的SQL语句语法. 我们建议经常访问"http://www.mysql.com"经常阅读本章的最新内容.同步功

MySQL手册版本 5.0.20-MySQL优化(二)

mysql|优化 7.2.1 EXPLAIN 语法(得到SELECT 的相关信息) EXPLAIN tbl_name 或者: EXPLAIN SELECT select_options EXPLAIN 语句可以被当作 DESCRIBE 的同义词来用,也可以用来获取一个MySQL要执行的 SELECT 语句的相关信息. EXPLAIN tbl_name 语法和 DESCRIBE tbl_name 或 SHOW COLUMNS FROM tbl_name 一样. 当在一个 SELECT 语句前使用关

MySQL手册版本 5.0.20-MySQL优化(一)

mysql|优化 7 MySQL 优化 数据库优化是一项很复杂的工作,因为这最终需要对系统优化的很好理解才行.尽管对系统或应用系统的了解不多的情况下优化效果还不错,但是如果想优化的效果更好,那么就需要对它了解更多才行. 本章主要讲解了几种优化MySQL的方法,并且给出了例子.记着,总有各种办法能让系统运行的更快,当然了,这需要更多的努力. 7.1 优化概述 让系统运行得快得最重要因素是数据库基本的设计.并且还必须清楚您的系统要用来做什么,以及存在的瓶颈. 最常见的系统瓶颈有以下几种: 磁盘搜索.

MySQL手册版本 5.0.20-MySQL优化(三)

mysql|优化 7.2.2 估算查询性能 在大多数情况下,可以通过统计磁盘搜索次数来估算查询的性能.对小表来说,通常情况下只需要搜索一次磁盘就能找到对应的记录(因为索引可能已经缓存起来了).对大表来说,大致可以这么估算,它使用B树做索引,想要找到一条记录大概需要搜索的次数为:log(row_count) / log(index_block_length / 3 * 2 / (index_length + data_pointer_length)) + 1. 在MySQL中,一个索引块通常是10

MySQL手册版本 5.0.20-MySQL优化(四) (1)(4)

可以在锁表后,一起执行几个语句来加速 INSERT 操作: LOCK TABLES a WRITE; INSERT INTO a VALUES (1,23),(2,34),(4,33); INSERT INTO a VALUES (8,26),(6,29); UNLOCK TABLES; 这对性能提高的好处在于:直到所有的 INSERT 语句都完成之后,索引缓存一次性刷新到磁盘中.通常情况是,多有少次 INSERT 语句就会有多数次索引缓存刷新到磁盘中的开销.如果能在一个语句中一次性插入多个值的

MySQL手册版本 5.0.20-MySQL优化(二) (1)

7.2.1 EXPLAIN 语法(得到SELECT 的相关信息) EXPLAIN tbl_name 或者: EXPLAIN SELECT select_options EXPLAIN 语句可以被当作 DESCRIBE 的同义词来用,也可以用来获取一个MySQL要执行的 SELECT 语句的相关信息. EXPLAIN tbl_name 语法和 DESCRIBE tbl_name 或 SHOW COLUMNS FROM tbl_name 一样. 当在一个 SELECT 语句前使用关键字 EXPLAI

MySQL手册版本 5.0.20-MySQL优化(四) (1)(2)

想要提高 ORDER BY 的速度,首先要看MySQL能否使用索引而非额外的排序过程.如果不能使用索引,可以试着遵循以下策略: 增加 sort_buffer_size 的值. 增加 read_rnd_buffer_size 的值. 修改 tmpdir,让它指向一个有很多剩余空间的专用文件系统.如果使用MySQL 4.1或更新,这个选项允许有多个路径用循环的格式.各个路径之间在 Unix 上用冒号(':')分隔开来,在 Windows,NetWare以及OS/2 上用分号(';').可以利用这个特

MySQL手册版本 5.0.20-MySQL优化(四) (1)(5)

通常地,应该保存所有的冗余数据(在数据库原理中叫做"第三范式").然而,为了能取得更高的效率复制一些信息或者创建摘要表也是划算的. 存储过程或者 UDFs(用户定义函数) 的方式在执行一些任务时可能性能更高.尽管如此,当数据库不支持这些特性时,还是有其他的替代方法可以达到目的,即使它们有点慢. 可以从查询缓存或应答中取得结果,然后将很多次的插入及更新操作放在一起做.如果数据库支持表锁(如MySQL和ORACLE),那么这就可以确保索引缓存在所有的更新操作之后只需要刷新一次. 当不需要直

MySQL手册版本 5.0.20-MySQL优化(四) (1)(3)

7.2.12 加速 INSERT 插入一条记录花费的时间由以下几个因素决定,后面的数字大致表示影响的比例: 连接:(3) 发送查询给服务器:(2) 解析查询:(2) 插入记录:(1 x 记录大小) 插入索引:(1 x 索引数量) 关闭:(1) 这里并没有考虑初始化时打开数据表的开销,因为每次运行查询只会做这么一次. 如果是 B-tree 索引的话,随着索引数量的增加,插入记录的速度以 log N 的比例下降. 可以使用以下几种方法来提高插入速度: 如果要在同一个客户端在同一时间内插入很多记录,可