java - 根据主键查询两次那个效率高?
阿神
阿神 2017-04-18 09:41:26
[Java讨论组]

表结构如下:

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
阿神
阿神

闭关修行中......

全部回复(1)
阿神

第一种方法效率高,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以后已经优化了。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号