- 论坛徽章:
- 0
|
文章中的关于索引优化的查询的内容中对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)
|
|