有这样的一个需求:select count(distinct nick) from user_access_xx_xx;

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

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

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

+———————-+

| count(distinct nick) |

+———————-+

| 806934 |

+———————-+

1 row in set (52.78 sec)

执行一次sql需要花费52.78s,已经非常的慢了

现在需要换一种思路来解决该问题:

我们知道索引的值是按照索引字段升序的,比如我们对(nick,other_column)两个字段做了索引,那么在索引中的则是按照nick,other_column的升序排列:

我们现在的sql:select count(distinct nick) from user_access;则是直接从nick1开始一条条扫描下来,直到扫描到最后一个nick_n,

那么中间过程会扫描很多重复的nick,如果我们能够跳过中间重复的nick,则性能会优化非常多(在oracle中,这种扫描技术为loose index scan,但在5.1的版本中,mysql中还不能直接支持这种优化技术):

所以需要通过改写sql来达到伪loose index scan:

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

| count(*) |

+———-+

| 806934 |

1 row in set (5.81 sec)

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

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

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

两个sql的执行计划分别为:

优化写法:

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

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

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

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

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

原始写法:

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

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

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

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

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

本文标题: 分析MySQL中优化distinct的技巧

本文地址: http://www.cppcns.com/shujuku/mysql/124348.html

mysql distinct 慢_分析MySQL中优化distinct的技巧相关推荐

  1. mysql解析运行时间_分析 MySQL 语句运行时间

    为了验证select 1 与 select 1 from tableName 与 select * from tableName的执行效率,需要测试一下各自执行的时间.于是总结一下,查看mysql语句 ...

  2. mysql授权许可_分析MySQL的授权许可

    MySQL是开源软件,但开源不意味着免费,开源软件的使用应遵循该软件提供的使用授权许可.MySQL的授权许可是英文的,而且一直以来没有权威的中文译本,所以很多人都不清楚其中的细节. 最近我在做一些AS ...

  3. mysql distinct 优化_Mysql应用分析MySQL中优化distinct的技巧

    <MysqL应用分析MysqL中优化distinct的技巧>要点: 本文介绍了MysqL应用分析MysqL中优化distinct的技巧,希望对您有用.如果有疑问,可以联系我们. sql用于 ...

  4. MySQL学习笔记_关于MySQL的字符类型VARCHAR长度知识总结

    MySQL学习笔记_关于MySQL的字符类型VARCHAR长度知识总结 一.VARCHAR存储和行长度限制 1.VARCHAR(N)中,N指的是字符的长度,VARCHAR类型最大支持65535,指的是 ...

  5. 拿走不谢!固件逆向分析过程中的工具和技巧(上)

    将固件逆向分析,然后再将逆向分析后的内容转换为有用的东西,这个过程对于所有人来说都是一个耗时又耗力的过程.有时即使文件出现在你面前,你也无能为力,比如你可能会面临专有(几乎没有文档记录)的文件格式.奇 ...

  6. mysql not exists无效_分析MySQL中哪些情况下数据库索引会失效

    要想分析MySQL查询语句中的相关信息,如是全表查询还是部分查询,就要用到explain. 一.explain 用法:explain +查询语句. id:查询语句的序列号,上面图片中只有一个selec ...

  7. 高性能mysql 小查询_高性能MySQL06-查询优化(慢查询)

    一.分析原因 SQL语句慢查询的原因有多种,如: 1)数据方面: 需要查询的表数据量太大导致性能下降: 是否向数据库请求了不需要的数据行或数据列: MySQL是否在扫描额外的记录 2)SQL语句太过于 ...

  8. mysql 执行概况_转mysql源码分析之SQL执行过程简介

    本人打算从SQL语句的执行开始学习和分析MYSQL源码,首先了解MYSQL是如何执行一条SQL语句的,详细了解它的执行过程之后,再深入学习执行一条SQL语句的运行原理. 1)从执行一条SQL语句的堆栈 ...

  9. mysql 显示用户_在Mysql中如何显示所有用户?

    这是一个mysql初学者经常问到的一个问题,今天我们就带大家看看是如何在Mysql中显示所有用户的.通常我们在mysql中使用SHOW DATABASES可以显示所有的数据库,SHOW TABLES将 ...

最新文章

  1. java线程泄露_面试官:小伙子先来说一下可能引起Java内存泄露的场景吧
  2. 圆环划痕检测halcon
  3. vs 如何将源文件转换成可执行文件_如何将手机便签转换成word文本文档
  4. 算法:同构字符串205. Isomorphic Strings
  5. steam linux安装目录在哪,Ubuntu 16.04 LTS 64位下安装steam游戏平台
  6. Python 数据处理库 pandas
  7. 基于Openstack的私有云搭建实践1——概述、原理与整体规划
  8. html中input type什么意思,HTML中type是什么意思
  9. Android:自动点击屏幕
  10. 如何在Sqlserver 中创建非dbo 的表
  11. 呼叫中心中继网关参数选型
  12. unity 实验演示 教程_铁匠常见问题解答和Unity演示团队
  13. VirtualBox-ubuntu系统下挂载U盘
  14. 形式语言与自动机理论的发展
  15. Accord.Net框架介绍
  16. 从表格读取数据的自动化模板
  17. 怎么查询手机是否有维修记录
  18. php 支付宝和微信pc支付
  19. 遭遇勒索病毒数据库被删除之后
  20. outlook2010设置msn的邮箱

热门文章

  1. excel转word
  2. 生猪养殖生产计划问题
  3. CCNA认证与其他网络工程师证书的区别
  4. 数控计算机键面英语怎么认,数控技术常用术语中英文对照
  5. 车辆出险保险索赔技巧
  6. 通过matlab对比CS_CoSaMP,CS_GBP,CS_IHT,CS_IRLS,CS_OMP,CS_SP六种压缩感知图像重构算法的PSNR性能
  7. TDD系列3-TDD过程实例-保龄球单局积分算法
  8. ARM64架构题目答案
  9. 2013最新显卡天梯图
  10. beatmaker3 android,Beat Maker Go节拍制作器