免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2299 | 回复: 3
打印 上一主题 下一主题

distinct以及group by的疑惑 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-06-03 18:23 |只看该作者 |倒序浏览
先说表结构
CREATE TABLE `keyword` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `key` char(64) NOT NULL,
  `value` char(32) DEFAULT NULL,
  `type` char(16) NOT NULL,
  `update_time` datetime DEFAULT NULL,
  `weighing` tinyint(4) DEFAULT '0',
  `count` int(11) DEFAULT '0',
  PRIMARY KEY (`id`,`key`),
  KEY `dudu_keyword_key` (`key`,`value`,`count`)
) ENGINE=MyISAM AUTO_INCREMENT=950 DEFAULT CHARSET=utf8

每次根据key做like,然后对value做distinct操作,根据count以及weighing做排序,取前10条,key和value是多对一的关系,例如'sina'=>'新浪','新浪'=>'新浪','xinlang'=>'新浪'....
大家肯定很奇怪,为什么要不id和key做联合主键,我本意是想用innodb,在主键上做查询,效率应该要高些,结果我失望了,like的时候压根就没有用主键.
于是对sql中用到的key,value,count做联合索引

最开始设想sql如下:select distinct value from keyword where key like "x%" order by count limit 10;
mysql> explain select distinct value from keyword where `key` like "x%" order by count limit 10\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: dudu_keyword
         type: range
possible_keys: dudu_keyword_key
          key: dudu_keyword_key
      key_len: 192
          ref: NULL
         rows: 38
        Extra: Using where; Using temporary; Using filesort
1 row in set (0.00 sec)
杯具,使用了临时表还进行了排序操作

于是继续尝试:SELECT  value FROM dudu_keyword where `key` like 'x%' group by value order by count limit 10
explain还是基本和上面一样:1, 'SIMPLE', 'dudu_keyword', 'range', 'dudu_keyword_key', 'dudu_keyword_key', '192', '', 38, 'Using where; Using index; Using temporary; Using filesort'
确是没办法不让group by或distinct不使用临时表!有经验的同仁停下脚,呵呵

论坛徽章:
0
2 [报告]
发表于 2010-06-04 11:02 |只看该作者
好像distinct或者group和order by一起用就会产生临时表

论坛徽章:
0
3 [报告]
发表于 2010-06-04 11:11 |只看该作者
采用松散索引扫描才不会用到临时表

论坛徽章:
0
4 [报告]
发表于 2010-06-05 09:52 |只看该作者
两个是一样的。 不过有一个倒排索引和正排索引。 哈哈。我自己起的名字。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP