MySQL查询优化器的工作原理

数据库 MySQL
MySQL如何提高查询效率是每一个DBA都经常要思考的问题,而查询优化器正是帮助我们解决此问题的有力武器。

MySQL查询优化器可以让我们的MySQL数据库查询效率更高,下面就为您分析MySQL查询优化器的工作原理,供您参考学习之用。

当你提交一个查询的时候,MySQL会分析它,看是否可以做一些优化使处理该查询的速度更快。这一部分将介绍查询优化器是如何工作的。如果你想知道MySQL采用的优化手段,可以查看MySQL参考手册。

当然,MySQL查询优化器也利用了索引,但是它也使用了其它一些信息。例如,如果你提交如下所示的查询,那么无论数据表有多大,MySQL执行它的速度都会非常快:

  1. SELECT * FROM tbl_name WHERE 0;  
  2.  

在这个例子中,MySQL查看WHERE子句,认识到没有符合查询条件的数据行,因此根本就不考虑搜索数据表。你可以通过提供一个EXPLAIN语句看到这种情况,这个语句让MySQL显示自己执行的但实际上没有真正地执行的SELECT查询的一些信息。如果要使用EXPLAIN,只需要在EXPLAIN单词放在SELECT语句的前面:

  1. mysql> EXPLAIN SELECT * FROM tbl_name WHERE 0\G  
  2. *************************** 1. row ***************************  
  3. id: 1  
  4. select_type: SIMPLE  
  5. table: NULL  
  6. type: NULL  
  7. possible_keys: NULL  
  8. key: NULL  
  9. key_len: NULL  
  10. ref: NULL  
  11. rows: NULL  
  12. Extra: Impossible WHERE   
  13.  

通常情况下,EXPLAIN返回的信息比上面的信息要多一些,还包括用于扫描数据表的索引、使用的联结类型、每张数据表中估计需要检查的数据行数量等非空(NULL)信息。

MySQL查询优化器是如何工作的

MySQL查询优化器有几个目标,但是其中最主要的目标是尽可能地使用索引,并且使用最严格的索引来消除尽可能多的数据行。你的最终目标是提交SELECT语句查找数据行,而不是排除数据行。优化器试图排除数据行的原因在于它排除数据行的速度越快,那么找到与条件匹配的数据行也就越快。如果能够首先进行最严格的测试,查询就可以执行地更快。假设你的查询检验了两个数据列,每个列上都有索引:

  1. SELECT col3 FROM mytable  
  2. WHERE col1 = ’some value’ AND col2 = ’some other value’;   

假设col1上的测试匹配了900个数据行,col2上的测试匹配了300个数据行,而同时进行的测试只得到了30个数据行。先测试Col1会有900个数据行,需要检查它们找到其中的30个与col2中的值匹配记录,其中就有870次是失败了。先测试col2会有300个数据行,需要检查它们找到其中的30个与col1中的值匹配的记录,只有270次是失败的,因此需要的计算和磁盘I/O更少。其结果是,优化器会先测试col2,因为这样做开销更小。

你可以通过下面一个指导帮助优化器更好地利用索引:

尽量比较数据类型相同的数据列。当你在比较操作中使用索引数据列的时候,请使用数据类型相同的列。相同的数据类型比不同类型的性能要高一些。例如,INT与BIGINT是不同的。CHAR(10)被认为是CHAR(10)或VARCHAR(10),但是与CHAR(12)或VARCHAR(12)不同。如果你所比较的数据列的类型不同,那么可以使用ALTER TABLE来修改其中一个,使它们的类型相匹配。
 

 

【编辑推荐】

MySQL无重复查询的实现

MySQL中SELECT命令的特殊用法

mysql命令行参数简介

MySQL条件查询语句的用法

使用Limit参数实现MySQL查询优化

 

责任编辑:段燃 来源: 互联网
相关推荐

2010-06-12 15:31:04

MySQL查询优化

2010-11-25 14:21:16

MySQL查询分页

2019-05-17 11:53:58

MySQLorder by数据库

2016-12-13 22:51:08

androidmultidex

2009-09-16 18:02:13

WSUS服务器

2010-10-14 16:27:56

MySQL随机查询

2010-10-27 14:57:24

Oracle查询

2018-06-07 08:54:01

MySQL性能优化索引

2013-12-19 14:04:18

MySQLMySQL优化

2021-06-03 19:55:55

MySQ查询优化

2018-05-23 13:47:28

数据库PostgreSQL查询优化

2018-05-25 15:04:57

数据库PostgreSQL查询优化器

2024-02-29 09:28:19

2024-02-20 14:53:01

2009-09-24 10:41:35

打印服务器

2009-11-13 17:19:10

2010-09-25 13:25:55

DHCP服务器工作原理

2011-04-07 15:32:25

2010-10-13 16:31:18

优化MySQL查询

2010-05-18 17:32:33

MySQL查询优化
点赞
收藏

51CTO技术栈公众号