免费注册 查看新帖 |

Chinaunix

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

关于索引的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-10-26 16:53 |只看该作者 |倒序浏览
本帖最后由 sosflyer 于 2011-10-26 16:57 编辑

表结构如下:
CREATE TABLE `vm_internal_data_201110` (
  `date` date NOT NULL,
  `mark` varchar(100) NOT NULL default '',
  `mark_1` varchar(100) NOT NULL default '',
  `from_id` char(255) NOT NULL default '00000000',
  `product_type` varchar(20) NOT NULL default '',
  `extend_type` int(5) NOT NULL default '0',
  `active_user` int(11) unsigned NOT NULL default '0',
  `sum_active_user` int(11) unsigned NOT NULL default '0',
  `updates` int(11) unsigned default NULL,
  `update_user` int(11) unsigned NOT NULL default '0',
  `update_user_single` int(11) unsigned NOT NULL default '0',
  `repost` int(11) unsigned NOT NULL default '0',
  `repost_user` int(11) unsigned NOT NULL default '0',
  `repost_user_single` int(11) unsigned NOT NULL default '0',
  `mth_effective_user` int(11) unsigned NOT NULL default '0',
  `effective_user` int(10) NOT NULL default '0',
  `effective_user_single` int(10) NOT NULL default '0',
  `bk_frozen` int(11) unsigned NOT NULL default '0',
  `bk_black` int(11) unsigned NOT NULL default '0',
  PRIMARY KEY  (`date`,`mark`,`mark_1`,`from_id`,`product_type`),
  KEY `index_power` (`extend_type`,`product_type`)
)

mysql> explain select date,mark,mark_1 from vm_internal_data_201110 where extend_type in (11,32,21,7,26,2,17,22,0,30,16,13,23,29,6,27,25,28,3,9,12,15,14,20,4,24,10,19,31,5) and mark in ('9012','9012','8008') and date >='2011-10-01' and date <='2011-10-25' group by date,mark,mark_1;
+----+-------------+-------------------------+------+---------------------+------+---------+------+---------+----------------------------------------------+
| id | select_type | table                   | type | possible_keys       | key  | key_len | ref  | rows    | Extra                                        |
+----+-------------+-------------------------+------+---------------------+------+---------+------+---------+----------------------------------------------+
| 1  | SIMPLE      | vm_internal_data_201110 | ALL  | PRIMARY,index_power |      |         |      | 7073288 | Using where; Using temporary; Using filesort |
+----+-------------+-------------------------+------+---------------------+------+---------+------+---------+----------------------------------------------+
为什么extend_type这个索引用不上呢
mysql> explain select date,mark,mark_1,sum(effective_user)/sum(sum_active_user) from vm_internal_data_201110 where product_type in ('PCAPP','WEIYU','APP','VMCLIENT','CMPC','VMWAP','AIYH','VMPC') and mark in ('9012','9012','8008') and date >='2011-10-01' and date <='2011-10-25' group by date,mark,mark_1;
+----+-------------+-------------------------+------+---------------+------+---------+------+---------+----------------------------------------------+
| id | select_type | table                   | type | possible_keys | key  | key_len | ref  | rows    | Extra                                        |
+----+-------------+-------------------------+------+---------------+------+---------+------+---------+----------------------------------------------+
| 1  | SIMPLE      | vm_internal_data_201110 | ALL  | PRIMARY       |      |         |      | 7073288 | Using where; Using temporary; Using filesort |
+----+-------------+-------------------------+------+---------------+------+---------+------+---------+----------------------------------------------+
如果sql语句里不加sum(effective_user)/sum(sum_active_user),则可以用到索引,加上这个就用不上了,求解啊。

论坛徽章:
0
2 [报告]
发表于 2011-10-27 09:43 |只看该作者
我知道字很多啊,哪位高人帮忙看看吧,真心求啊

论坛徽章:
0
3 [报告]
发表于 2011-10-27 13:34 |只看该作者
possible_keys 只是显示可选索引好瓦,你的两个查询都不走索引

论坛徽章:
0
4 [报告]
发表于 2011-10-27 13:42 |只看该作者
mysql> explain select date,mark,mark_1,sum(effective_user)/sum(sum_active_user) from vm_internal_data_201110 where product_type in ('PCAPP','WEIYU','APP','VMCLIENT','CMPC','VMWAP','AIYH','VMPC') and mark in ('9012','9012','8008') and date >='2011-10-01' and date <='2011-10-25' group by date,mark,mark_1;
+----+-------------+-------------------------+-------+---------------+---------+---------+------+------+-------------+
| id | select_type | table                   | type  | possible_keys | key     | key_len | ref  | rows | Extra       |
+----+-------------+-------------------------+-------+---------------+---------+---------+------+------+-------------+
|  1 | SIMPLE      | vm_internal_data_201110 | range | PRIMARY       | PRIMARY | 105     | NULL |    1 | Using where |
+----+-------------+-------------------------+-------+---------------+---------+---------+------+------+-------------+
1 row in set (0.00 sec)

mysql> explain select date,mark,mark_1 from vm_internal_data_201110 where product_type in ('PCAPP','WEIYU','APP','VMCLIENT','CMPC','VMWAP','AIYH','VMPC') and mark in ('9012','9012','8008') and date >='2011-10-01' and date <='2011-10-25' group by date,mark,mark_1;
+----+-------------+-------------------------+-------+---------------+---------+---------+------+------+--------------------------+
| id | select_type | table                   | type  | possible_keys | key     | key_len | ref  | rows | Extra                    |
+----+-------------+-------------------------+-------+---------------+---------+---------+------+------+--------------------------+
|  1 | SIMPLE      | vm_internal_data_201110 | index | PRIMARY       | PRIMARY | 484     | NULL |    1 | Using where; Using index |
+----+-------------+-------------------------+-------+---------------+---------+---------+------+------+--------------------------+
1 row in set (0.00 sec)

mysql>
回复 2# sosflyer


加与不加都使用不到你所说的索引.

论坛徽章:
0
5 [报告]
发表于 2011-10-27 14:10 |只看该作者
回复 4# todayhero


    你看这条

  1. mysql> explain select date,mark,mark_1,sum(effective_user)/sum(sum_active_user) from vm_internal_data_201110 where product_type in ('PCAPP','WEIYU','APP','VMCLIENT','CMPC','VMWAP','AIYH','VMPC') and mark in ('9012','9012','8008') and date >='2011-10-01' and date <='2011-10-25' group by date,mark,mark_1;
  2. +----+-------------+-------------------------+------+---------------+------+---------+------+---------+----------------------------------------------+
  3. | id | select_type | table                   | type | possible_keys | key  | key_len | ref  | rows    | Extra                                        |
  4. +----+-------------+-------------------------+------+---------------+------+---------+------+---------+----------------------------------------------+
  5. | 1  | SIMPLE      | vm_internal_data_201110 | ALL  | PRIMARY       |      |         |      | 7368397 | Using where; Using temporary; Using filesort |
  6. +----+-------------+-------------------------+------+---------------+------+---------+------+---------+----------------------------------------------+
  7. 1 row in set (0.01 sec)
复制代码
怎么我执行的就是这样的呢?

论坛徽章:
0
6 [报告]
发表于 2011-10-27 14:15 |只看该作者
你根本没有建.extend_type这个单列索引.
只是建了一个组合索引.
index_power

论坛徽章:
0
7 [报告]
发表于 2011-10-27 14:24 |只看该作者
回复 6# todayhero


    囧,确实,我以为主键里有了就可以不单独建了。。。

  在麻烦帮看下下面这个
  1. mysql> explain select extend_type,sum(active_user) from vm_internal_data_201110 where date between '2011-10-01' and '2011-10-26' and extend_type in (11,32,21,7,26,2,17,22,0,30,16,13,23,29,6,27,25,28,3,9,12,15,14,20,4,24,10,19,31,5) and product_type in ('APP','CMPC','AIYH','VMPC','VMWAP','VMCLIENT','WEIYU','PCAPP') group by extend_type,date;
  2. +----+-------------+-------------------------+------+---------------------+------+---------+------+---------+----------------------------------------------+
  3. | id | select_type | table                   | type | possible_keys       | key  | key_len | ref  | rows    | Extra                                        |
  4. +----+-------------+-------------------------+------+---------------------+------+---------+------+---------+----------------------------------------------+
  5. | 1  | SIMPLE      | vm_internal_data_201110 | ALL  | PRIMARY,index_power |      |         |      | 7368397 | Using where; Using temporary; Using filesort |
  6. +----+-------------+-------------------------+------+---------------------+------+---------+------+---------+----------------------------------------------+
  7. 1 row in set (0.09 sec)

  8. mysql> explain select extend_type,sum(active_user) from vm_internal_data_201110 where date between '2011-10-01' and '2011-10-26' and extend_type in (11,32,21,7,26,2,17,22,30,16,13,23,29,6,27,25,28,3,9,12,15,14,20,4,24,10,19,31,5) and product_type in ('APP','CMPC','AIYH','VMPC','VMWAP','VMCLIENT','WEIYU','PCAPP') group by extend_type,date;
  9. +----+-------------+-------------------------+-------+---------------------+-------------+---------+------+--------+----------------------------------------------+
  10. | id | select_type | table                   | type  | possible_keys       | key         | key_len | ref  | rows   | Extra                                        |
  11. +----+-------------+-------------------------+-------+---------------------+-------------+---------+------+--------+----------------------------------------------+
  12. | 1  | SIMPLE      | vm_internal_data_201110 | range | PRIMARY,index_power | index_power | 46      |      | 665369 | Using where; Using temporary; Using filesort |
  13. +----+-------------+-------------------------+-------+---------------------+-------------+---------+------+--------+----------------------------------------------+
  14. 1 row in set (0.09 sec)
复制代码
两次执行就只有一个地方不一样extend_type in(0),第一次多一个0这个值,怎么联合索引就用不上了呢???

论坛徽章:
0
8 [报告]
发表于 2011-10-27 14:36 |只看该作者
回复 7# sosflyer


    你两个语句是不是一样啊!我的执行结果都一样的.
  1. mysql> explain select extend_type,sum(active_user) from vm_internal_data_201110 where date between '2011-10-01' and '2011-10-26' and extend_type in (11,32,21,7,26,2,17,22,0,30,16,13,23,29,6,27,25,28,3,9,12,15,14,20,4,24,10,19,31,5) and product_type in ('APP','CMPC','AIYH','VMPC','VMWAP','VMCLIENT','WEIYU','PCAPP') group by extend_type,date;
  2. +----+-------------+-------------------------+-------+---------------------+---------+---------+------+------+----------------------------------------------+
  3. | id | select_type | table                   | type  | possible_keys       | key     | key_len | ref  | rows | Extra                                        |
  4. +----+-------------+-------------------------+-------+---------------------+---------+---------+------+------+----------------------------------------------+
  5. |  1 | SIMPLE      | vm_internal_data_201110 | range | PRIMARY,index_power | PRIMARY | 3       | NULL |    1 | Using where; Using temporary; Using filesort |
  6. +----+-------------+-------------------------+-------+---------------------+---------+---------+------+------+----------------------------------------------+
  7. 1 row in set (0.00 sec)

  8. mysql> explain select extend_type,sum(active_user) from vm_internal_data_201110 where date between '2011-10-01' and '2011-10-26' and extend_type in (11,32,21,7,26,2,17,22,30,16,13,23,29,6,27,25,28,3,9,12,15,14,20,4,24,10,19,31,5) and product_type in ('APP','CMPC','AIYH','VMPC','VMWAP','VMCLIENT','WEIYU','PCAPP') group by extend_type,date;
  9. +----+-------------+-------------------------+-------+---------------------+---------+---------+------+------+----------------------------------------------+
  10. | id | select_type | table                   | type  | possible_keys       | key     | key_len | ref  | rows | Extra                                        |
  11. +----+-------------+-------------------------+-------+---------------------+---------+---------+------+------+----------------------------------------------+
  12. |  1 | SIMPLE      | vm_internal_data_201110 | range | PRIMARY,index_power | PRIMARY | 3       | NULL |    1 | Using where; Using temporary; Using filesort |
  13. +----+-------------+-------------------------+-------+---------------------+---------+---------+------+------+----------------------------------------------+
  14. 1 row in set (0.00 sec)
复制代码
而且你的表有数据,有的表里没有数据,对测试的结果是有影响的.

论坛徽章:
0
9 [报告]
发表于 2011-10-27 14:38 |只看该作者
而且都用到了index_power这个组合索引.你具体想问什么?

论坛徽章:
0
10 [报告]
发表于 2011-10-27 14:42 |只看该作者
针对SQL语句:
mysql> explain select date,mark,mark_1 from vm_internal_data_201110 where extend_type in (11,32,21,7,26,2,17,22,0,30,16,13,23,29,6,27,25,28,3,9,12,15,14,20,4,24,10,19,31,5) and mark in ('9012','9012','8008') and date >='2011-10-01' and date <='2011-10-25' group by date,mark,mark_1;

建议创建一个组合索引

ALTER TABLE vm_internal_data_201110 ADD INDEX idx_date_mark_mark1(date,mark,mark1);

再执行EXPLAIN看下执行计划的效果如何....

顺道再推荐一篇文章:
MySQL中创建及优化索引组织结构的思路
URL:http://www.mysqlops.com/2011/05/ ... optimize-index.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP