您好,UncleToo欢迎您!  为了更好的浏览本站,请使用高版本浏览器
RSS  Tag     设为首页 | 加入收藏
 您所在的位置:首页 > 数据库技术 > MySQL

MySQL优化之distinct

作者:未知  来源:转载  日期:2015-06-16 23:45:48
收藏  评论:( 0 )  阅读:228

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)



除非特别声明,本站所有PHP教程及其他教程/文章均为原创、翻译或网友投稿,版权均归UncleToo中文网所有, 转载请注明作者及出处。
原文网址:http://www.uncletoo.com/html/mysql/1134.html
读完这篇文章后,你是否有所收获? 分享是一种生活的信念!
  • 0
  • 0
我来说两句
更多>>网友评论