loose index scan 优化distinct

  • 时间:
  • 浏览:1
  • 来源:UU快3直播官网

通过查看执行计划,也为全索引扫描,sql在执行的并且 ,会对整个服务器带来抖动;

| id | select_type | table                        | type  | possible_keys | key                        | key_len | ref  | rows     | Extra       |

这样上面过程会扫描什么都有重复的nick,并且 大家儿不需要 跳过上面重复的nick,则性能会优化非常多(在oracle中,你这种 扫描技术为loose index scan,但在5.1的版本中,mysql中还不需要 直接支持你这种 优化技术):

+—-+————-+——————————+——-+—————+————-

+———-+

原始写法:

有曾经的一一个多需求:select count(distinct nick) from user_access_xx_xx;

|  1 | SIMPLE      | user_access | range | NULL          | ind_user_access_nick | 67      | NULL | 2124695 | Using index for group-by |

| count(distinct nick) |

1 row in set (5.81 sec)

root@db 09:41:60 >select count(*) from ( select distinct(nick) from user_access)t ;

|               60 6934 |

root@db 09:42:55>explain select count(distinct nick) from user_access;

现在时需换某种思路来外理该大现象:

上篇中大家儿提到用伪loose index scan来优化max/min,你这种 篇大家儿将用伪loose index scan来优化distinct:

时需注意的是mysql把distinct优化为group by,它首先利用索引来分组,并且 扫描索引,对时需的nick只扫描一次;

+—-+————-+——————————+——-+—————+————-

一个多sql的执行计划分别为:

Sql中先选出不同的nick,最后在外面套一层,就不需要 得到nick的distinct值总和;

最重要的是在子查询中:select distinct(nick) 实现了上图中的伪loose index scan,优化器在你这种 并且 的执行计划为Using index for group-by ,

这条sql用于统计用户访问的uv,并且 单表的数据量在10G以上,即使在user_access_xx_xx上打上去nick的索引,

root@db 09:41:10>explain select distinct(nick) from user_access-> ;

| count(*) |

+———————-+

优化写法:

大家儿现在的sql:select count(distinct nick) from user_access;则是直接从nick1现在结束了了了了二根条扫描下来,直到扫描到最后一一个多nick_n,

+—-+————-+——————————+——-+—————+————-| id | select_type | table                        | type  | possible_keys | key                             | key_len | ref  | rows    | Extra                    |

|   60 6934 |

+———————-+

执行一次sql需离米 52.78s,并且 非常的慢了

大家儿知道索引的值是按照索引字段升序的,比如大家儿对(nick,other_column)一个多字段做了索引,这样在索引中的则是按照nick,other_column的升序排列:

|  1 | SIMPLE      | user_access | index | NULL          | ind_user_access | 177     | NULL | 19546123 | Using index |

+———————-+

root@db 09:00:12>select count(distinct nick) from user_access;

1 row in set (52.78 sec)

+—-+————-+——————————+——-+—————+————-

+—-+————-+——————————+——-+—————+————-

什么都有时需通过改写sql来达到伪loose index scan: