`

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的技巧

    在MySQL数据库中,优化`DISTINCT`操作是一个关键的性能提升策略,特别是在处理大量数据时。上述场景中,用户遇到了一个问题:对一个10G以上的单表`user_access_xx_xx`执行`SELECT COUNT(DISTINCT nick)`以统计唯一...

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

    ### DISTINCT优化之MySQL官方文档翻译解析 #### 一、引言 在数据库查询操作中,经常需要使用`DISTINCT`关键字来去除重复记录,确保结果集中的每一条记录都是唯一的。然而,在某些场景下,使用`DISTINCT`可能会导致...

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

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

    MySQL数据库优化SQL篇PPT课件.pptx

    从执行计划、SELECT语句、IN和EXIST语句、LIMIT语句、RAND函数、Order by、Group by、Distinct和Count等方面对MySQL数据库优化进行了详细的讲解。 一、执行计划 执行计划是MySQL数据库优化的重要步骤。执行计划...

    MySQL数据库查询优化

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

    MySQL DISTINCT 的基本实现原理详解

    MySQL DISTINCT 是一种用于消除查询结果...在设计数据库时,合理的索引策略可以帮助优化DISTINCT操作,减少全表扫描和临时表的使用,从而提高查询速度。在实际应用中,理解这些原理有助于写出更高效、更优化的SQL查询。

    vc 小技巧 mysql distinct 语句

    同时,优化`DISTINCT`查询性能也是数据库设计和管理的重要部分,可能涉及索引策略、查询重构等方法。 总结来说,`DISTINCT`是MySQL中用于获取唯一数据的关键字,而VC开发者可以通过MySQL Connector/C++库与MySQL...

    MySQL索引优化课件

    MySQL索引优化是数据库性能提升的关键技术之一,尤其在处理大量数据时,高效索引能够显著加快查询速度,降低服务器负载。本课件主要聚焦于MySQL数据库的索引原理、优化策略以及相关存储过程和触发器的应用。 首先,...

    MySql性能优化集合--满满的干货

    #### 一、MySQL优化概述 MySQL作为一种广泛使用的开源关系型数据库管理系统,在数据处理方面表现优秀。然而,在高并发、大数据量的情况下,可能会遇到性能瓶颈。因此,进行MySQL性能优化是非常必要的。MySQL优化...

    MySQL优化.pdf

    MySQL是世界上最受欢迎的开源数据库系统之一,尤其在后端开发、架构师、运维以及DBA等领域,MySQL的应用无处不在,也是面试时不可或缺的技术考察点。本课程由讲师徐磊带领,聚焦MySQL的面试热点和高级特性,旨在帮助...

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

    在MySQL数据库中,`DISTINCT`和`GROUP BY`都是用于数据去重和分组的SQL语句,但它们有着不同的应用场景和优化策略。本文将深入探讨`DISTINCT`语句的基本原理,并与`GROUP BY`进行比较。 首先,`DISTINCT`关键字用于...

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

    在MySQL数据库中,`DISTINCT` 和 `COUNT(*)` 是两种常见的SQL查询关键字,它们各自有不同的用途和场景。本文将详细探讨这两种方法的使用方法及其差异。 首先,`DISTINCT` 关键字用于从查询结果中去除重复的记录。在...

    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进阶优化

    ### MySQL 进阶优化知识点详解 #### 一、SQL语句优化原则与实践 在进行MySQL性能优化时,首先需要了解的是SQL语句优化的基本原则。优化的目标是提高查询效率,减少不必要的数据处理,从而提升数据库的整体性能。...

Global site tag (gtag.js) - Google Analytics