WEB开发网
开发学院数据库MySQL 查询性能的优化 - 查询慢的基础知识:优化数据访问... 阅读

查询性能的优化 - 查询慢的基础知识:优化数据访问

 2009-09-02 00:00:00 来源:WEB开发网   
核心提示: 检查和返回的行当分析查询语句时,考虑检查的行数是非常有用的,查询性能的优化 - 查询慢的基础知识:优化数据访问(3),因为你能查看查询是怎样找到你所需要的数据的,然而,索引可以让MySQL更高效的找到所需的行并且检查更少的数据,让我们看看Sakila数据库的例子:mysql> SELECT

检查和返回的行

当分析查询语句时,考虑检查的行数是非常有用的。因为你能查看查询是怎样找到你所需要的数据的。然而,就像执行时间,这个指标来发现不好的语句并不是很完美。并不是所有的行的访问是相同的。短的行访问时间很快,并且从内存中获取行要比从硬盘中更快。

理想的情况下,所检查的行数和返回的行数相同,但是在实际中并不太可能。举个例子,当join构建的行时候,很多行一定被访问用来在结果集中生成行。检查和返回行的比例一般来说都很小,在1:1和10:1之间,但是有的时候也可能会很大。

行的检查和访问类型

当你思考一个查询的消耗,要考虑在一个表中查找一个单独行的消耗。MySQL会使用许多访问方法来找到和返回一行。一些查询检查很多的行,但是其他的可能没有检查任何行就会生成结果。

这个访问类型在EXPLAIN输出的TYPE列中显示。这个访问类型从全表扫描(full table scan)到,索引扫描(index scans),范围扫描(range scans),唯一索引查找(unique index lookups),以及常量(constants)。它们的速度是依次递增的,因为它需要访问很少的数据。你不比记下这些类型,但是你应该明白扫描表,扫描一个索引,范围访问,以及单值访问的基本概念。

如果语句的访问类型不好,最佳的方法就是添加一个合适的索引。我们已经在前一章讨论了索引。现在你应该明白为什么索引对于查询优化如此重要了吧。索引可以让MySQL更高效的找到所需的行并且检查更少的数据。

让我们看看Sakila数据库的例子:

mysql> SELECT * FROM sakila.film_actor WHERE film_id = 1;

这个查询会返回10行,并且EXPLAIN显示了MySQL使用了ref访问类型。

mysql> EXPLAIN SELECT * FROM sakila.film_actor WHERE film_id = 1\G

*************************** 1. row ***************************

           id: 1

  select_type: SIMPLE

        table: film_actor

         type: ref

possible_keys: idx_fk_film_id

          key: idx_fk_film_id

      key_len: 2

          ref: const

         rows: 10

        Extra:

上一页  1 2 3 4  下一页

Tags:查询 性能 优化

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接