我有倆个表、一个是全部城市的表(数据量3K左右)、一个是所有ip段的表(数据量为47W左右)、
就是想知道一个ip是哪里的城市、 给于显示 该城市id 、名、和大区select district1_.CN_ID , district1_.CN_BIG_AREA , district1_.CN_NAME from MD_IP_ADDR ipaddress0_
cross join MD_DISTRICT district1_
where ipaddress0_.CN_CITY_ID=district1_.CN_ID
and INET_ATON('202.96.64.68')>=ipaddress0_.CN_IP1_LONG
and INET_ATON('202.96.64.68')<=ipaddress0_.CN_IP2_LONG limit 1
这条语句在mysql里查询第一次是3秒多、第二次才是0.3秒左右、所以想问下有没有优化该sql的途径?另外该语句写在java的程序里、使用基本的connection 和perparstatement 进行查询、每次都是3秒左右、
感觉perparstatement 根本没有预编译过、如果有优化的方式可以告诉我下、先谢谢各位了、
就是想知道一个ip是哪里的城市、 给于显示 该城市id 、名、和大区select district1_.CN_ID , district1_.CN_BIG_AREA , district1_.CN_NAME from MD_IP_ADDR ipaddress0_
cross join MD_DISTRICT district1_
where ipaddress0_.CN_CITY_ID=district1_.CN_ID
and INET_ATON('202.96.64.68')>=ipaddress0_.CN_IP1_LONG
and INET_ATON('202.96.64.68')<=ipaddress0_.CN_IP2_LONG limit 1
这条语句在mysql里查询第一次是3秒多、第二次才是0.3秒左右、所以想问下有没有优化该sql的途径?另外该语句写在java的程序里、使用基本的connection 和perparstatement 进行查询、每次都是3秒左右、
感觉perparstatement 根本没有预编译过、如果有优化的方式可以告诉我下、先谢谢各位了、
我ip表建立了索引、
其实ip是个动态参数、
我拿过来给转成long型好比较大小的、
贴索引
SHOW INDEX FROM tbl_name
md_ip_addr 1 qwe 1 CN_IP1_LONG A 516552 YES BTREE
md_ip_addr 1 qwe 2 CN_IP2_LONG A 516552 YES BTREE
索引名:qwe 字段CN_IP1_LONG, CN_IP2_LONG 类型Normal建表语句:
CREATE TABLE `MD_IP_ADDR` (
`CN_ID` int(11) NOT NULL AUTO_INCREMENT,
`CN_IP1` varchar(15) DEFAULT NULL,
`CN_IP2` varchar(15) DEFAULT NULL,
`CN_IP1_LONG` bigint(18) DEFAULT NULL,
`CN_IP2_LONG` bigint(18) DEFAULT NULL,
`CN_NAME` varchar(200) DEFAULT NULL,
`CN_PROVINCE_NAME` varchar(80) DEFAULT NULL,
`CN_CITY_NAME` varchar(80) DEFAULT NULL,
`CN_AREA_NAME` varchar(80) DEFAULT NULL,
`CN_PROVINCE_ID` int(11) DEFAULT NULL,
`CN_CITY_ID` int(11) DEFAULT NULL,
`CN_AREA_ID` int(11) DEFAULT NULL,
PRIMARY KEY (`CN_ID`),
KEY `qwe` (`CN_IP1_LONG`,`CN_IP2_LONG`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1591073 DEFAULT CHARSET=utf8
1 SIMPLE Impossible WHERE noticed after reading const tables
中间都没有数据
就第一个 第二个 还有最后一个才有数据