![]() | 1 hvsy 2014-08-22 16:12:29 +08:00 提供详细的信息.字段的类型.数据量等. |
![]() | 2 xing393939 2014-08-22 16:15:25 +08:00 貌似的用来通过ip确定地区的,一定要用查表的方式吗 |
![]() | 3 zoosucker OP @hvsy IP字段是32位整型的,地址位置是varchar(300),数据量大概50W条记录。业务是输入一个IP地址,给出地址位置。 |
![]() | 4 shiny 2014-08-22 16:17:01 +08:00 根据 ip 查地理位置? ip2long,然后每次查询的时候把 ip 转成整数查范围。 |
![]() | 5 shiny 2014-08-22 16:18:51 +08:00 44万条的纯真 ip sqlite 数据库都跑得飞快,可以参考下…… |
![]() | 7 akira 2014-08-22 16:19:30 +08:00 一个网段开始IP,一个网段结束IP 改成可以直接比较的数字,并建立索引, 查询定位应该能有数量级的速度提升 |
![]() | 9 akira 2014-08-22 16:26:20 +08:00 explain 下你的sql,看看是不是哪里全表扫描了 |
10 pp3182429 2014-08-22 16:26:48 +08:00 mysql里有自带的IP转换为数字的函数 inet_aton ,再给IP加个索引,插入的时候会慢一点,但是查询的话应该会很快 |
![]() | 11 zoosucker OP @akira select address from ip_db where ip between ip_start and ip_end; |
![]() | 12 royzheng 2014-08-22 16:43:15 +08:00 ![]() 表StartIP,EndIP,Location,另外再新建两个字段StartIPInt,EndIPInt 比如 StartIP:1.2.3.4 EndIP:5.6.7.8 Location:US StartIPInt:1*256^3+2*256^2+3*256^1+4*256^0=16909060 EndIPInt:5*256^3+6*256^2+7*256^1+8*256^0=84281096 比如查询2.4.5.9 2.4.5.9=2*256^3+4*256^2+5*256^1+9*256^0=33817865 select * from ip where StartIPInt <= 33817865 AND EndIPInt >=33817865 效率能慢到哪里去 |
![]() | 15 2688 2014-08-22 23:12:04 +08:00 才50万 不可能慢,就大于和小于比较而已。 |
17 nomaka 2014-08-23 11:38:42 +08:00 一秒10w次 你已经不能用单台mysql了吧, 找个内存数据库 |
![]() | 19 zoosucker OP 最后用了redis,约1.4亿IP,用了32GB内存,没有between and 直接select操作,10W条用了0.7s。 |