`

MySQL优化之distinct

 
阅读更多

 

distinct实际上和group by的操作非常相似,只不过是在group by之后的每组中取出一条记录而已。

但是distinct分组的时候是不使用排序来做分组的。

 

同样distinct也分为松散索引扫描和紧凑索引扫描

 

松散索引

   测试过程中我发现如果distinct中的字段本身是唯一的或者没有数据则Extra中不是Using index for group-by,而是显示using Index,说明MySQL在这块还是比较智能的。

    如果插入了数据需要更新表信息,analyze table group_message

 

mysql> explain select distinct gid from group_message \G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: group_message
         type: range
possible_keys: IDX_GID_UID_GMT
          key: IDX_GID_UID_GMT
      key_len: 5
          ref: NULL
         rows: 3
        Extra: Using index for group-by
1 row in set (0.03 sec)

mysql> explain select distinct id from group_message \G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: group_message
         type: index
possible_keys: PRIMARY,IDX_GID_UID_GMT
          key: IDX_GID_UID_GMT
      key_len: 16
          ref: NULL
         rows: 5
        Extra: Using index
1 row in set (0.03 sec)

 

 

紧凑索引扫描:

   

mysql> explain select distinct uid from group_message where gid = 1\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: group_message
         type: ref
possible_keys: IDX_GID_UID_GMT
          key: IDX_GID_UID_GMT
      key_len: 5
          ref: const
         rows: 5
        Extra: Using where; Using index
1 row in set (0.32 sec)

   

   distinct不能使用索引的情况:我们发现只使用了临时表并没有使用到排序。

   

mysql> explain select distinct uid from group_message \G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: group_message
         type: index
possible_keys: IDX_GID_UID_GMT
          key: IDX_GID_UID_GMT
      key_len: 16
          ref: NULL
         rows: 5
        Extra: Using index; Using temporary
1 row in set (0.02 sec)

 

 

    表结构:

    

mysql> show create table group_message \G
*************************** 1. row ***************************
       Table: group_message
Create Table: CREATE TABLE `group_message` (
  `id` int(11) NOT NULL,
  `message` varchar(1000) DEFAULT NULL,
  `gid` int(11) DEFAULT NULL,
  `uid` int(11) DEFAULT NULL,
  `gmt_ctreate` datetime DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `IDX_GID_UID_GMT` (`gid`,`uid`,`gmt_ctreate`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.03 sec)

 

0
0
分享到:
评论

相关推荐

    分析MySQL中优化distinct的技巧

    有这样的一个需求:select count(distinct nick) from user_access_xx_xx; 这条sql用于统计用户访问的uv,由于单表的数据量在10G以上,即使在user_access_xx_xx上加上nick的索引, 通过查看执行计划,也为全索引扫描...

    MySQL中索引优化distinct语句及distinct的多字段操作

    在一些情况下,MySQL可以使用索引优化DISTINCT操作,但需要活学活用.本文涉及一个不能利用索引完成DISTINCT操作的实例.   实例1 使用索引优化DISTINCT操作 create table m11 (a int, b int, c int, d int, primary ...

    【DISTINCT】优化之MySQL官方文档翻译

    【DISTINCT】优化之MySQL官方文档翻译

    MySQL数据库查询优化

    课程大纲: 第1课 数据库与关系代数 综述数据库、关系代数、查询优化技术 综述数据库调优技术 预计时间1小时 第2课 数据库查询优化技术总揽 ...真正认识、掌握MySQL的查询优化技术,大步流星步入查询优化的高手之列。

    MySQL中distinct和count(*)的使用方法比较

    首先对于MySQL的DISTINCT的关键字的一些用法: 1.在count 不重复的记录的时候能用到,比如SELECT COUNT( DISTINCT id ) FROM tablename;就是计算talbebname表中id不同的记录有多少条。 2,在需要返回记录不同...

    mysql查询优化.

    1、理解MYSQL的Query Optimizer 2、Query语句优化基本思路和原则 3、充分利用Explain 和 Profiling 4、合理设计并利用索引 5、order by、group by 和 DISTINCT优化 6、小结

    MySQL关键字Distinct的详细介绍

    MySQL关键字Distinct用法介绍 DDL Prepare SQL: create table test(id bigint not null primary key auto_increment, name varchar(10) not null, phone varchar(10) not null, email varchar(30) not null)...

    MySQL中distinct语句的基本原理及其与group by的比较

    同样可以通过松散索引扫描或者是紧凑索引扫描来实现,当然,在无法仅仅使用索引即能完成 DISTINCT 的时候,MySQL 只能通过临时表来完成。但是,和 GROUP BY 有一点差别的是,DISTINCT 并不需要进行排序。也就是说,...

    MySql 5.1 参考手册.chm

    7.2.8. MySQL如何优化DISTINCT 7.2.9. MySQL如何优化LEFT JOIN和RIGHT JOIN 7.2.10. MySQL如何优化嵌套Join 7.2.11. MySQL如何简化外部联合 7.2.12. MySQL如何优化ORDER BY 7.2.13. MySQL如何优化GROUP BY 7.2.14. ...

    MySQL DISTINCT 的基本实现原理详解

    同样可以通过松散索引扫描或者是紧凑索引扫描来实现,当然,在无法仅仅使用索引即能完成 DISTINCT 的时候,MySQL 只能通过临时表来完成。 但是,和 GROUP BY 有一点差别的是,DISTINCT 并不需要进行排序。也就是说,...

    MySQL 5.1参考手册

    7.2.8. MySQL如何优化DISTINCT 7.2.9. MySQL如何优化LEFT JOIN和RIGHT JOIN 7.2.10. MySQL如何优化嵌套Join 7.2.11. MySQL如何简化外部联合 7.2.12. MySQL如何优化ORDER BY 7.2.13. MySQL如何优化GROUP BY ...

    MySQL中Distinct和Group By语句的基本使用教程

    MySQL Distinct 去掉查询结果重复记录 DISTINCT 使用 DISTINCT 关键字可以去掉查询中某个字段的重复记录。 语法: SELECT DISTINCT(column) FROM tb_name 例子: 假定 user 表有如下记录: uid username 1 小李...

    高性能MySQL(第3版).part2

    6.7.4优化GROUPBY和DISTINCT239 6.7.5优化LIMIT分页241 6.7.6优化SQL_CALC_FOUND_ROWS243 6.7.7优化UNION查询243 6.7.8静态查询分析244 6.7.9使用用户自定义变量244 6.8案例学习251 6.8.1使用MySQL构建一个...

    MySQL 5.1中文手冊

    7.2.8. MySQL如何优化DISTINCT 7.2.9. MySQL如何优化LEFT JOIN和RIGHT JOIN 7.2.10. MySQL如何优化嵌套Join 7.2.11. MySQL如何简化外部联合 7.2.12. MySQL如何优化ORDER BY 7.2.13. MySQL如何优化GROUP BY 7.2.14. ...

    MySQL SQL优化 .docx

    order by, group by,distinct … 都是消耗 CPU 的大户(这些操作基本上都是 CPU 处理内存中的数据比较运算)。当我们的 IO 优化做到一定阶段之后,降低 CPU 计算也就成为了我们 SQL 优化的重要目标

    MySQL 5.1官方简体中文参考手册

    7.2.8. MySQL如何优化DISTINCT 7.2.9. MySQL如何优化LEFT JOIN和RIGHT JOIN 7.2.10. MySQL如何优化嵌套Join 7.2.11. MySQL如何简化外部联合 7.2.12. MySQL如何优化ORDER BY 7.2.13. MySQL如何优化GROUP BY 7.2.14. ...

    MySQL 5.1参考手册中文版

    7.2.8. MySQL如何优化DISTINCT 7.2.9. MySQL如何优化LEFT JOIN和RIGHT JOIN 7.2.10. MySQL如何优化嵌套Join 7.2.11. MySQL如何简化外部联合 7.2.12. MySQL如何优化ORDER BY 7.2.13. MySQL如何优化GROUP BY ...

Global site tag (gtag.js) - Google Analytics