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)
相关推荐
在MySQL数据库中,优化`DISTINCT`操作是一个关键的性能提升策略,特别是在处理大量数据时。上述场景中,用户遇到了一个问题:对一个10G以上的单表`user_access_xx_xx`执行`SELECT COUNT(DISTINCT nick)`以统计唯一...
### DISTINCT优化之MySQL官方文档翻译解析 #### 一、引言 在数据库查询操作中,经常需要使用`DISTINCT`关键字来去除重复记录,确保结果集中的每一条记录都是唯一的。然而,在某些场景下,使用`DISTINCT`可能会导致...
在一些情况下,MySQL可以使用索引优化DISTINCT操作,但需要活学活用.本文涉及一个不能利用索引完成DISTINCT操作的实例. 实例1 使用索引优化DISTINCT操作 create table m11 (a int, b int, c int, d int, primary ...
从执行计划、SELECT语句、IN和EXIST语句、LIMIT语句、RAND函数、Order by、Group by、Distinct和Count等方面对MySQL数据库优化进行了详细的讲解。 一、执行计划 执行计划是MySQL数据库优化的重要步骤。执行计划...
课程大纲: 第1课 数据库与关系代数 综述数据库、关系代数、查询优化技术 综述数据库调优技术 预计时间1小时 第2课 数据库查询优化技术总揽 ...真正认识、掌握MySQL的查询优化技术,大步流星步入查询优化的高手之列。
MySQL DISTINCT 是一种用于消除查询结果...在设计数据库时,合理的索引策略可以帮助优化DISTINCT操作,减少全表扫描和临时表的使用,从而提高查询速度。在实际应用中,理解这些原理有助于写出更高效、更优化的SQL查询。
同时,优化`DISTINCT`查询性能也是数据库设计和管理的重要部分,可能涉及索引策略、查询重构等方法。 总结来说,`DISTINCT`是MySQL中用于获取唯一数据的关键字,而VC开发者可以通过MySQL Connector/C++库与MySQL...
MySQL索引优化是数据库性能提升的关键技术之一,尤其在处理大量数据时,高效索引能够显著加快查询速度,降低服务器负载。本课件主要聚焦于MySQL数据库的索引原理、优化策略以及相关存储过程和触发器的应用。 首先,...
#### 一、MySQL优化概述 MySQL作为一种广泛使用的开源关系型数据库管理系统,在数据处理方面表现优秀。然而,在高并发、大数据量的情况下,可能会遇到性能瓶颈。因此,进行MySQL性能优化是非常必要的。MySQL优化...
MySQL是世界上最受欢迎的开源数据库系统之一,尤其在后端开发、架构师、运维以及DBA等领域,MySQL的应用无处不在,也是面试时不可或缺的技术考察点。本课程由讲师徐磊带领,聚焦MySQL的面试热点和高级特性,旨在帮助...
在MySQL数据库中,`DISTINCT`和`GROUP BY`都是用于数据去重和分组的SQL语句,但它们有着不同的应用场景和优化策略。本文将深入探讨`DISTINCT`语句的基本原理,并与`GROUP BY`进行比较。 首先,`DISTINCT`关键字用于...
在MySQL数据库中,`DISTINCT` 和 `COUNT(*)` 是两种常见的SQL查询关键字,它们各自有不同的用途和场景。本文将详细探讨这两种方法的使用方法及其差异。 首先,`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 进阶优化知识点详解 #### 一、SQL语句优化原则与实践 在进行MySQL性能优化时,首先需要了解的是SQL语句优化的基本原则。优化的目标是提高查询效率,减少不必要的数据处理,从而提升数据库的整体性能。...