首页 > 数据库技术 > 详细

MySQL优化之distinct

时间:2015-06-17 02:13:15      阅读:333      评论:0      收藏:0      [点我收藏+]

?

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

原文:http://labreeze.iteye.com/blog/2220194

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!