免费注册 查看新帖 |

Chinaunix

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

【讨论中】为啥group by 不走索引 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-09-07 13:14 |只看该作者 |倒序浏览
本帖最后由 cenalulu 于 2012-09-09 20:19 编辑

表结构tbl110
  1. +------------+----------------------+------+-----+---------------------+-------+
  2. | Field      | Type                 | Null | Key | Default             | Extra |
  3. +------------+----------------------+------+-----+---------------------+-------+
  4. | Start_Date | datetime             | NO   | PRI | 0000-00-00 00:00:00 |       |
  5. | LAC_CI     | varchar(11)          | NO   | PRI |                     |       |
  6. | CELL_CI    | smallint(5) unsigned | YES  | MUL | NULL                |       |
  7. | CELL_LAC   | smallint(5) unsigned | YES  | MUL | NULL                |       |
  8. | MC01       | int(11)              | YES  |     | NULL                |       |
  9. | MC02       | int(11)              | YES  |     | NULL                |       |
复制代码
索引:
  1. mysql> show index from tbl110;
  2. +--------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
  3. | Table  | Non_unique | Key_name   | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_Comment |
  4. +--------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
  5. | tbl110 |          0 | PRIMARY    |            1 | LAC_CI      | A         |       10153 |     NULL | NULL   |      | BTREE      |         |               |
  6. | tbl110 |          0 | PRIMARY    |            2 | Start_Date  | A         |      700596 |     NULL | NULL   |      | BTREE      |         |               |
  7. | tbl110 |          1 | Start_Date |            1 | Start_Date  | A         |         115 |     NULL | NULL   |      | BTREE      |         |               |
  8. | tbl110 |          1 | LAC_CI     |            1 | LAC_CI      | A         |       10153 |     NULL | NULL   |      | BTREE      |         |               |
  9. | tbl110 |          1 | CELL_CI    |            1 | CELL_CI     | A         |       10153 |     NULL | NULL   | YES  | BTREE      |         |               |
  10. | tbl110 |          1 | CELL_LAC   |            1 | CELL_LAC    | A         |          39 |     NULL | NULL   | YES  | BTREE      |         |               |
  11. +--------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
  12. 6 rows in set (0.04 sec)
复制代码
下面查询不走索引:
  1. mysql> explain select lac_ci, start_date,sum(MC01) from tbl110 group by lac_ci, start_date;
  2. +----+-------------+--------+------+---------------+------+---------+------+--------+---------------------------------+
  3. | id | select_type | table  | type | possible_keys | key  | key_len | ref  | rows   | Extra                           |
  4. +----+-------------+--------+------+---------------+------+---------+------+--------+---------------------------------+
  5. |  1 | SIMPLE      | tbl110 | ALL  | NULL          | NULL | NULL    | NULL | 700596 | Using temporary; Using filesort |
  6. +----+-------------+--------+------+---------------+------+---------+------+--------+---------------------------------+
  7. 1 row in set (0.06 sec)
复制代码
据说如果要走索引,聚合函数只能用min()或max(), 或者常量,试了一下Min(),还是不走索引:
  1. mysql> explain select lac_ci, start_date,min(MC01) from tbl110 group by lac_ci, start_date;
  2. +----+-------------+--------+------+---------------+------+---------+------+--------+---------------------------------+
  3. | id | select_type | table  | type | possible_keys | key  | key_len | ref  | rows   | Extra                           |
  4. +----+-------------+--------+------+---------------+------+---------+------+--------+---------------------------------+
  5. |  1 | SIMPLE      | tbl110 | ALL  | NULL          | NULL | NULL    | NULL | 700596 | Using temporary; Using filesort |
  6. +----+-------------+--------+------+---------------+------+---------+------+--------+---------------------------------+
  7. 1 row in set (0.07 sec)
复制代码
用常量倒是可以:
  1. mysql> explain select lac_ci, start_date,"fuck" from tbl110 group by lac_ci, start_date;
  2. +----+-------------+--------+-------+---------------+---------+---------+------+--------+--------------------------+
  3. | id | select_type | table  | type  | possible_keys | key     | key_len | ref  | rows   | Extra                    |
  4. +----+-------------+--------+-------+---------------+---------+---------+------+--------+--------------------------+
  5. |  1 | SIMPLE      | tbl110 | range | NULL          | PRIMARY | 32      | NULL | 700597 | Using index for group-by |
  6. +----+-------------+--------+-------+---------------+---------+---------+------+--------+--------------------------+
  7. 1 row in set (0.00 sec)
复制代码
问题是我要用到其他的聚合函数呀,比如sum,avg等

有解决办法吗?

论坛徽章:
0
2 [报告]
发表于 2012-09-07 14:15 |只看该作者
好冷清,是因为今天周五吗?

论坛徽章:
0
3 [报告]
发表于 2012-09-08 00:16 |只看该作者
给表结构、索引请用show create table 简单明了!! 这样看太别扭了,很不习惯

论坛徽章:
9
每日论坛发贴之星
日期:2016-01-04 06:20:00数据库技术版块每日发帖之星
日期:2016-01-04 06:20:00每日论坛发贴之星
日期:2016-01-04 06:20:00数据库技术版块每日发帖之星
日期:2016-01-04 06:20:00IT运维版块每日发帖之星
日期:2016-01-04 06:20:00IT运维版块每日发帖之星
日期:2016-01-04 06:20:00综合交流区版块每日发帖之星
日期:2016-01-04 06:20:00综合交流区版块每日发帖之星
日期:2016-01-04 06:20:00数据库技术版块每周发帖之星
日期:2016-03-07 16:30:25
4 [报告]
发表于 2012-09-09 20:23 |只看该作者
楼主的这个例子不具有代表性, 由于lac_ci 和startdate 组成了联合主键,即说明每种组合下都只有一条记录,这样也就没有做group-by以及 min,sum之类的函数需要了。
建议楼主用其他列作为group by对象再做测试

论坛徽章:
8
CU大牛徽章
日期:2013-09-18 15:20:48CU大牛徽章
日期:2013-09-18 15:20:58CU大牛徽章
日期:2013-09-18 15:21:06CU大牛徽章
日期:2013-09-18 15:21:12CU大牛徽章
日期:2013-09-18 15:21:17天秤座
日期:2013-10-30 14:01:03摩羯座
日期:2013-11-29 18:02:31luobin
日期:2016-06-17 17:46:36
5 [报告]
发表于 2012-09-17 10:10 |只看该作者
回复 1# zhn158
@cenalulu 正解。 由于楼主基本是对每条记录做group by所以优化器会理解为不适用索引效率会更高。


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP