我有一张表,大约有 360 万条记录。此表有 2 个 INT 列,表示 IPv4“范围”(从和到)
没有任何索引的查询,如:
SELECT * FROM tablename WHERE INET_ATON("an ip address") BETWEEN fromi AND toi;
在大约 4 秒内返回(5 行)。
在 fromi 和 toi ( ADD INDEX foo USING BTREE (fromi ASC, toi ASC)
)上添加索引后
重复相同的查询需要更长的时间(我实际上不知道多少,因为我在 6 分钟后中止了)。
我想知道为什么。
据我所知,mysql中没有详细的“解释计划”。这些是结果EXPLAIN EXTENDED
:
无索引:
EXPLAIN EXTENDED SELECT * FROM tablename
WHERE INET_ATON("an ip address") BETWEEN fromi AND toi;
select_type: SIMPLE
table: tablename
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 3634094
filtered: 100.00
Extra: Using where
#takes 4 seconds to query
带索引:
EXPLAIN EXTENDED SELECT * FROM tablename
WHERE INET_ATON("an ip address") BETWEEN fromi AND toi;
select_type: SIMPLE
table: tablename
type: ALL
possible_keys: foo
key: NULL
key_len: NULL
ref: NULL
rows: 3634094
filtered: 50.00
Extra: Using where
#takes really long to query
####################################################
EXPLAIN EXTENDED SELECT * FROM tablename FORCE INDEX(foo)
WHERE INET_ATON("an ip address") BETWEEN fromi AND toi;
select_type: SIMPLE
table: tablename
type: ALL
possible_keys: foo
key: foo
key_len: 5
ref: NULL
rows: 1817047
filtered: 100.00
Extra: Using where
#also takes really long to query
奇怪的是,索引只有在那儿才会减慢查询速度,mysql甚至不使用它(键:NULL)。