0

約 360 万レコードのテーブルがあります。このテーブルには、IPv4 の「範囲」(from と to) を表す 2 つの INT 列があります。

インデックスなしのクエリは次のようになります。

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)。

4

0 に答える 0