Chinaunix首页 | 论坛 | 博客
  • 博客访问: 109828
  • 博文数量: 13
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 195
  • 用 户 组: 普通用户
  • 注册时间: 2012-10-23 13:16
个人简介

数据库领域专心吃草

文章分类

全部博文(13)

文章存档

2015年(1)

2014年(4)

2013年(8)

我的朋友

分类: Mysql/postgreSQL

2013-12-16 14:40:14

join_buffer_size:

    mysql在内部处理多表join的方法是嵌套循环(nested_loop),引入join_buffer的目的是减少嵌套循环外层的取数据的次数,提升查询性能。

   mysql使用到join_buffer的一些注意事项:
 
   1、只有当sql语句explain的结果type为ALL、index、range才会使用到join_buffer_size;

   2、当有多个表进行join的时候会为每个join分别分配join_buffer_size,所以一个查询有可能分配多个join_buffer_size;

   3、join_buffer只会缓存使用到的行数据,不会缓存多余的行数据

    4、当无法分配足够的内存空间给join_buffer的时候,mysql不会报错,也不会警告,查询会继续执行,只是没有使用join_buffer。这是遗留BUG,
        BUG地址:

explain type   :

    当我们使用explain来查询sql语句的查询计划的时候,type(join type)字段是一个很重要的观察对象,在对join_buffer_size的使用说明中介绍了只有当type为ALL、
index和range的时候才会使用join_buffer_size,所以先来看看这3个类型的具体含义是什么:

   ALL:A full table scan is done for each combination of rows from the previous tables,对涉及到的表进行全表扫描,当表的数据量比较大的时候,全表扫描是比较费时费力的操作,这种情况是我们要避免出现的。

   index:A full index scan,对涉及到的索引进行索引扫描,跟ALL类似,在数据量较大的时候也是费时费力的操作,也是需要避免出现的情形。

   range:使用索引查询一定范围的数据,这是我们可以接受的操作。

   到这里可以结合join_buffer_size的介绍进行部分总结:ALL、index这种操作是最坏情况下的操作,即使使用了join_buffer_size,当数据量较大的情况下也不会有很好的性能。range使用了索引,查询部分数据,使用join_buffer_size是可以提升性能的。所以我们选择调优join_buffer_size参数的原因在于是否使用了很多join type为range的join查询,真实环境还是要结合表的数据量进行具体的评估和测试。

    下面列出其他的explain的type内容:

    system:当表数据只有一行的时候,explain的类型为system

   const:当一张表中匹配的数据只有一行的时候,也就是说外层循环只会执行一次。

   eq_ref:当表进行join的时候,每次循环取数据的时候只会从表中取出一行,也就是说使用了primary key 和unique key。这是我们比较希望看到的情形
 
   ref:当查询使用到普通索引的时候,一个key值有可能从索引中取出若干行,这也是我们比较希望看到的情况。

   fulltext:使用到全文索引的查询。

   ref_or_null:类似ref,但是会额外的检查null值。我的观点是null最好避免在数据库中出现,null会进行额外的处理,影响部分性能,没有了null也能避免查询使用ref_or_null的方式来执行。

    index_merge:查询使用了一张表的多个索引来取数据。

   unique_subquery:当查询语句中有IN操作符的时候,mysql使用unique_subquery来执行查询,是类似ref的一种索引查找方式,适用于unique索引

   index_subquery:当查询语句中有IN操作符的时候,mysql使用index_subquery来执行查询,是类似ref的一种索引查找方式,适用于普通索引
   
   

   








    

阅读(6988) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~