免费注册 查看新帖 |

Chinaunix

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

按mysql技术内幕书中的范例添加索引,使用索引优化查询未成功 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-06-27 12:48 |只看该作者 |倒序浏览
文章中的关于索引优化的查询的内容中对member表expiration添加索引,以下为该表结构:
| member | CREATE TABLE `member` (
  `member_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `last_name` varchar(20) NOT NULL,
  `first_name` varchar(20) NOT NULL,
  `suffix` varchar(5) DEFAULT NULL,
  `expiration` date DEFAULT NULL,
  `email` varchar(100) DEFAULT NULL,
  `street` varchar(50) DEFAULT NULL,
  `city` varchar(50) DEFAULT NULL,
  `state` varchar(2) DEFAULT NULL,
  `zip` varchar(10) DEFAULT NULL,
  `phone` varchar(20) DEFAULT NULL,
  `interests` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`member_id`),
  KEY `exp` (`expiration`)
) ENGINE=MyISAM AUTO_INCREMENT=103 DEFAULT CHARSET=gb2312 |

然后对三条返回结果相同的语句进行比较
select * from member where to_days(expiration) - to_days(curdate()) < 30
select * from member where to_days(expiration) < 30 + to_days(curdate())
select * from member where expiration < date_add(curdate(), interval 30 day)

第三句会使用到索引,通过explain应该看到使用索引后的不在对全表进行扫描,但我实际的结果是:
mysql> explain select * from member where expiration < date_add(curdate(), interval 30 day)\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: member
         type: ALL
possible_keys: exp
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 102
        Extra: Using where
1 row in set (0.00 sec)
这个是什么原因?附表内容,修改后缀即可
insert_member.sql.word (19.15 KB, 下载次数: 7) create_member.sql.word (559 Bytes, 下载次数: 10)

论坛徽章:
0
2 [报告]
发表于 2013-06-27 13:30 |只看该作者
因为这个数据太少了。仅102行,朋友解释是优化器会自动选择全表扫,不过我尝试了强制索引,或者select expiration 列查,虽然使用索引,但扫的行数为95,和书中范例的只检索6行不一样。
mysql> explain select * from member force index (exp) where expiration < date_add(curdate(), interval 30 day)\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: member
         type: range
possible_keys: exp
          key: exp
      key_len: 4
          ref: NULL
         rows: 95
        Extra: Using where
1 row in set (0.00 sec)
朋友说这种模拟环境看不出索引的优点。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP