CREATE TABLE `test` (
  `member_id` int(10) NOT NULL default '0',
  `sex` int(1) default NULL,
  `birth` varchar(10) collate gb2312_bin default NULL,
  `grade` int(1) default '0',
  PRIMARY KEY  (`member_id`),
  KEY `sex` (`sex`,`birth`(4),`grade`)
) ENGINE=InnoDB DEFAULT CHARSET=gb2312 COLLATE=gb2312_bin;INSERT INTO `test` (`member_id`,`sex`,`birth`,`grade`) VALUES (202775,2,'1975',1);
INSERT INTO `test` (`member_id`,`sex`,`birth`,`grade`) VALUES (202776,1,'1974-2-3',0);
INSERT INTO `test` (`member_id`,`sex`,`birth`,`grade`) VALUES (202777,1,'1978-10-20',0);
INSERT INTO `test` (`member_id`,`sex`,`birth`,`grade`) VALUES (202778,2,'1970',1);
INSERT INTO `test` (`member_id`,`sex`,`birth`,`grade`) VALUES (202779,1,'1956-1-3',0);
INSERT INTO `test` (`member_id`,`sex`,`birth`,`grade`) VALUES (202780,1,'1980',0);
INSERT INTO `test` (`member_id`,`sex`,`birth`,`grade`) VALUES (202781,1,'1975',0);
INSERT INTO `test` (`member_id`,`sex`,`birth`,`grade`) VALUES (202782,2,'1978-9-13',1);commit;执行EXPLAIN
explain select * from member_ttt where sex=1 and birth>1980 order by grade;以下是输出的结果
1 SIMPLE member_ttt ref sex sex const 13 Using where; Using filesort如果是这么写,就没有using filesort。
explain select * from member_ttt where sex=1 and birth>1980 order by grade;但是birth字段我需要指定一个范围,例如birth>1980 and birth<1990。根据年龄查询。birth字段是VARCHAR型的,因为有时候可能存储的是 '1980' 或 '1980-12-2'已经困扰我好几天了,这个索引如何建才能解决问题呢

解决方案 »

  1.   

    抱歉,表名写错了,更正为
    explain select * from test where sex=1 and birth>1980 order by grade;
    以上这个语句就会出现using filesort如果是这么写,就没有using filesort。
    explain select * from test where sex=1 and birth=1980 order by grade;请高手给出解决方案,去掉filesort
      

  2.   

    那你就把这个字段的类型改为int吧
      

  3.   

    step1 alter table test drop index sex;
    step2 alter table test add index sex(sex,grade,birth(4));
    step3 explain select * from test where sex=1 and grade>=0 and birth>'1980' order by grade;
    :P
    btw,' and grade>=0' is necessary.