V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
zoosucker
V2EX  ›  程序员

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

  •  
  •   zoosucker · 2014 年 8 月 22 日 · 4560 次点击
    这是一个创建于 4161 天前的主题,其中的信息可能已经有所发展或是发生改变。
    现在有一张表,记录网段和对应地理位置,三个字段,一个网段开始IP,一个网段结束IP,一个地理位置,我使用了MySQL,多线程,索引,表分区,内存表,但是效率依旧不高,这样的业务适合Mysql吗?如果适合Mysql,怎样提高查询效率呢?
    19 条回复    2014-09-10 16:50:42 +08:00
    hvsy
        1
    hvsy  
       2014 年 8 月 22 日
    提供详细的信息.字段的类型.数据量等.
    xing393939
        2
    xing393939  
       2014 年 8 月 22 日
    貌似的用来通过ip确定地区的,一定要用查表的方式吗
    zoosucker
        3
    zoosucker  
    OP
       2014 年 8 月 22 日
    @hvsy IP字段是32位整型的,地址位置是varchar(300),数据量大概50W条记录。业务是输入一个IP地址,给出地址位置。
    shiny
        4
    shiny  
    PRO
       2014 年 8 月 22 日
    根据 ip 查地理位置? ip2long,然后每次查询的时候把 ip 转成整数查范围。
    shiny
        5
    shiny  
    PRO
       2014 年 8 月 22 日
    44万条的纯真 ip sqlite 数据库都跑得飞快,可以参考下……
    zoosucker
        6
    zoosucker  
    OP
       2014 年 8 月 22 日
    @shiny 我知道,还有个MM,不过那是竞争对手,肯定没法用了。
    akira
        7
    akira  
       2014 年 8 月 22 日
    一个网段开始IP,一个网段结束IP

    改成可以直接比较的数字,并建立索引, 查询定位应该能有数量级的速度提升
    zoosucker
        8
    zoosucker  
    OP
       2014 年 8 月 22 日
    @akira 都用了,不过效率依然不高啊。
    akira
        9
    akira  
       2014 年 8 月 22 日
    explain 下你的sql,看看是不是哪里全表扫描了
    pp3182429
        10
    pp3182429  
       2014 年 8 月 22 日
    mysql里有自带的IP转换为数字的函数 inet_aton ,再给IP加个索引,插入的时候会慢一点,但是查询的话应该会很快
    zoosucker
        11
    zoosucker  
    OP
       2014 年 8 月 22 日
    @akira select address from ip_db where ip between ip_start and ip_end;
    royzheng
        12
    royzheng  
       2014 年 8 月 22 日   ❤️ 1
    表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
        13
    akira  
       2014 年 8 月 22 日
    @zoosucker 不要用between。用royzheng的方法来写
    zoosucker
        14
    zoosucker  
    OP
       2014 年 8 月 22 日
    @akira 好吧 我试试看
    2688
        15
    2688  
       2014 年 8 月 22 日
    才50万 不可能慢,就大于和小于比较而已。
    zoosucker
        16
    zoosucker  
    OP
       2014 年 8 月 23 日
    @2688 单条查询不慢,差多了就慢了,请问一秒能查10W次吗?
    nomaka
        17
    nomaka  
       2014 年 8 月 23 日
    一秒10w次 你已经不能用单台mysql了吧, 找个内存数据库
    Zuckonit
        18
    Zuckonit  
       2014 年 8 月 23 日
    @nomaka +1
    zoosucker
        19
    zoosucker  
    OP
       2014 年 9 月 10 日
    最后用了redis,约1.4亿IP,用了32GB内存,没有between and 直接select操作,10W条用了0.7s。
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   1294 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 17:16 · PVG 01:16 · LAX 09:16 · JFK 12:16
    ♥ Do have faith in what you're doing.