表结构如下:
CREATE TABLE `country_area_relation` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
`country_id` int(11) NOT NULL COMMENT '国家ID',
`area_id` int(11) NOT NULL COMMENT '区域ID',
`gmt_create` datetime NOT NULL COMMENT '@desc 创建时间',
`creator` varchar(32) NOT NULL COMMENT '@desc 创建人',
`modifier` varchar(32) NOT NULL COMMENT '@desc 修改者',
`gmt_modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '@desc 修改时间',
`is_deleted` char(1) NOT NULL DEFAULT 'n' COMMENT '@desc 是否删除',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=79 DEFAULT CHARSET=utf8 COMMENT='国家区域关系表';
现在要根据主键id查两次表取得数据,有两种方法,分别如下:
方法一:
CountryAreaRelationExample ex = new CountryAreaRelationExample();
CountryAreaRelationExample.Criteria criteria = ex.createCriteria();
criteria.andCountryIdIn(new ArrayList<Integer>(){{add(1);add(2);}});
List<CountryAreaRelation> list = countryAreaRelationMapperExt.selectByExample(ex);
方法二:
countryAreaRelationMapperExt.selectByPrimaryKey(1);
countryAreaRelationMapperExt.selectByPrimaryKey(2);
都是根据主键查,上述两种方法,哪种效率高?除此之外,还有更高效率的方法么?
=================================================================
补充测试结果:
SELECT * FROM idc_logistics_assign_rules WHERE id = '100';
SELECT * FROM idc_logistics_assign_rules WHERE id = '200';
//时间: 0.035s
SELECT * FROM idc_logistics_assign_rules WHERE id IN ('100','200')
//时间: 0.020s
第一种方法效率高,java语句不太熟,但是看转化的SQL,第一种方法应该是最优的。
in用不用索引?根据情况而定。即根据是否能够利用索引而定。当in的范围是聚集索引 in(1,2) 会被MSSQL自动优化成id=1 or id=2 ,你可以使用explain看下,他返回的row是2 in(1,2)与id=1 or id=2 explain返回的数据都是一样的。我可以很负责的告诉你是有用索引。网上很多提及不走索引的大部分都是旧资料,MSSQL2K以后已经优化了。