研究了半天Mysql文档,也没看懂(翻译的真是难懂。。)
现在有如下一个表:
CREATE TABLE `t_ip_test` (
  `id` BIGINT(20) NOT NULL,
  `from_ip` BIGINT(20) NOT NULL,
  `to_ip` BIGINT(20) NOT NULL,
  `name_en1` VARCHAR(20) DEFAULT NULL,
  `name_en2` VARCHAR(20) DEFAULT NULL,
  `country_name` VARCHAR(100) NOT NULL,
  PRIMARY KEY (`id`)
)就是一个ip与地理位置匹配的表
应该创建哪种索引可以对如下查询生效呢?
SELECT * FROM t_ip_test WHERE INET_ATON('209.207.224.40')>=from_ip  AND INET_ATON('209.207.224.40')<=to_ip;我之前创建的索引CREATE INDEX ip ON t_ip_test(id,from_ip,to_ip);
explain之后发现并没有使用,查了半天文档,是在没搞明白文档里说的是啥。。难道意思是要使用hash-索引?
那是不是要建memory表呢?

解决方案 »

  1.   


    可是为啥我创建的BTREE索引无效呢
      

  2.   

    都支持,MYSQL默认的索引是BTREE。
      

  3.   

    CREATE   INDEX   ip   ON   t_ip_test(from_ip,to_ip); 
    这样试试呢!
      

  4.   


    饿 sorry,前面写错了 CREATE INDEX ip ON t_ip_test(from_ip,to_ip);  我确实是这么写的,但是没有效果,很纠结
      

  5.   

    默认的索引应该可以  看看 where语句中= 的数据类型是否一样 
      

  6.   


    我把查询条件改成= 之后,explain一下发现索引是有效的SELECT   *   FROM   t_ip_test   WHERE   3520061480  =from_ip     AND   3520061480  =to_ip; 但是切换成SELECT * FROM T_ip_country WHERE from_ip<=3520061480 AND to_ip>=3520061480;之后检索到了可用索引,但是并没有使用,仍然进行的是ALL扫描
      

  7.   

    另外数据类型都是bigint类型
      

  8.   

    SELECT * FROM T_ip_country WHERE from_ip<=3520061480 AND from_ip>=3520061480;
    这样也是可以用到索引的
    from_ip<=3520061480 AND to_ip>=3520061480难道是因为两个不同的变量就不可以了?