SELECT country,province,city,isp FROM ip_address FORCE INDEX(start_end_ip) WHERE 3658152023 BETWEEN start_ip AND end_ip;
某一个IP查询IP库属于哪个城市
这条语句都要执行1秒多钟,是怎么回事啊"id" "select_type" "table" "type" "possible_keys" "key" "key_len" "ref" "rows" "Extra"
"1" "SIMPLE" "      ip_address" "range" "start_end_ip" "start_end_ip"  "9" \N "169538" "Using where"
 这是它的执行计划

解决方案 »

  1.   

    1 确保你的start_ip/end_ip都是数值型,而不是字符串
    2 加一个自增长字段id作为主键
      

  2.   

    start_end_ip 索引是什么样的?(start_ip,end_ip)?
    我看不出问题来~~
      

  3.   

    INDEX(start_end_ip),似乎是另外的一列,不过既然是IP类型的,我估计多半是以字符串的形式存储,而且这些IP肯定有不少重复的。。楼主应该说清楚你的业务逻辑,让大家想办法建立唯一索引。这样才会快。
      

  4.   

    show index from ip_address 看一下。表设计估计不合理。 建议你的IP地址还是用字符格式。但格式化一下 010.127.030.000 这种字符串格式,然后索引起来比较容易。
      

  5.   


    start_ip/end_ip都是数值型的,不是字符串型的
    索引是start_ip/end_ip
    表结构是:
      

  6.   

    profile分析,他的结果是sending data要的时间很长,但是只这个查询只返回一条记录
      

  7.   

    SELECT country,province,city,isp FROM ip_address FORCE INDEX(start_end_ip) WHERE 3658921360 BETWEEN start_ip AND end_ip;
      

  8.   

    这个例子的主要问题是符合  end_ip>3658921360  太多记录了,估计80%以上。 从命题上来说,这个无法仅通过 start_ip  或者end_ip 上的索引解决。除非能把语句优化成 end_ip between 3658921360-100 and 365892136+100 这种形式。
      

  9.   

    告诉各位:
      这个问题我只要加个自增主键就OK了,就只要300毫秒左右了另外把此表分成两表start_IP=end_ip做一个表,start_IP!=end_ip的做一个表那更快了
    谢谢各位的讨论。。