研究了半天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表呢?
现在有如下一个表:
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表呢?
可是为啥我创建的BTREE索引无效呢
这样试试呢!
饿 sorry,前面写错了 CREATE INDEX ip ON t_ip_test(from_ip,to_ip); 我确实是这么写的,但是没有效果,很纠结
我把查询条件改成= 之后,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扫描
这样也是可以用到索引的
from_ip<=3520061480 AND to_ip>=3520061480难道是因为两个不同的变量就不可以了?