单个表,如何提高查询效率?

2014-08-22 16:08:52 +08:00
 zoosucker
现在有一张表,记录网段和对应地理位置,三个字段,一个网段开始IP,一个网段结束IP,一个地理位置,我使用了MySQL,多线程,索引,表分区,内存表,但是效率依旧不高,这样的业务适合Mysql吗?如果适合Mysql,怎样提高查询效率呢?
3918 次点击
所在节点    程序员
19 条回复
hvsy
2014-08-22 16:12:29 +08:00
提供详细的信息.字段的类型.数据量等.
xing393939
2014-08-22 16:15:25 +08:00
貌似的用来通过ip确定地区的,一定要用查表的方式吗
zoosucker
2014-08-22 16:16:24 +08:00
@hvsy IP字段是32位整型的,地址位置是varchar(300),数据量大概50W条记录。业务是输入一个IP地址,给出地址位置。
shiny
2014-08-22 16:17:01 +08:00
根据 ip 查地理位置? ip2long,然后每次查询的时候把 ip 转成整数查范围。
shiny
2014-08-22 16:18:51 +08:00
44万条的纯真 ip sqlite 数据库都跑得飞快,可以参考下……
zoosucker
2014-08-22 16:19:01 +08:00
@shiny 我知道,还有个MM,不过那是竞争对手,肯定没法用了。
akira
2014-08-22 16:19:30 +08:00
一个网段开始IP,一个网段结束IP

改成可以直接比较的数字,并建立索引, 查询定位应该能有数量级的速度提升
zoosucker
2014-08-22 16:21:24 +08:00
@akira 都用了,不过效率依然不高啊。
akira
2014-08-22 16:26:20 +08:00
explain 下你的sql,看看是不是哪里全表扫描了
pp3182429
2014-08-22 16:26:48 +08:00
mysql里有自带的IP转换为数字的函数 inet_aton ,再给IP加个索引,插入的时候会慢一点,但是查询的话应该会很快
zoosucker
2014-08-22 16:40:30 +08:00
@akira select address from ip_db where ip between ip_start and ip_end;
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
效率能慢到哪里去
akira
2014-08-22 16:50:06 +08:00
@zoosucker 不要用between。用royzheng的方法来写
zoosucker
2014-08-22 16:51:27 +08:00
@akira 好吧 我试试看
2688
2014-08-22 23:12:04 +08:00
才50万 不可能慢,就大于和小于比较而已。
zoosucker
2014-08-23 08:05:35 +08:00
@2688 单条查询不慢,差多了就慢了,请问一秒能查10W次吗?
nomaka
2014-08-23 11:38:42 +08:00
一秒10w次 你已经不能用单台mysql了吧, 找个内存数据库
Zuckonit
2014-08-23 16:36:42 +08:00
@nomaka +1
zoosucker
2014-09-10 16:50:42 +08:00
最后用了redis,约1.4亿IP,用了32GB内存,没有between and 直接select操作,10W条用了0.7s。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/129345

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX