Log目次

【MySQL】IN句の肥大化によるテーブルスキャンに注意する

作成日 2022-12-30更新日 2022-12-30

IN句の数ごとの実行計画を確認する

タイトルの通りIN句の数による実行計画の変化を確認する

100件指定、1000件指定、10000件指定の3パターンを確認する

100件指定

-- 長いのでIN句は一部省略 explain SELECT * FROM `companies` WHERE `companies`.`name` IN ('1','2','3','4','5','6','7','8','9','10',,,'100')

indexが効いていることがわかる

idselect_typetablepartitionstypepossible_keyskeykey_lenrefrowsfilteredExtra
1SIMPLEcompaniesNULLrangeidx_nameidx_name1023NULL100100Using index condition

1000件指定

-- 長いのでIN句は一部省略 explain SELECT * FROM `companies` WHERE `companies`.`name` IN ('1','2','3','4','5','6','7','8','9','10',,,'1000')

indexが効いていることがわかる

idselect_typetablepartitionstypepossible_keyskeykey_lenrefrowsfilteredExtra
1SIMPLEcompaniesNULLrangeidx_nameidx_name1023NULL1000100Using index condition

10000件指定

-- 長いのでIN句は一部省略 explain SELECT * FROM `companies` WHERE `companies`.`name` IN ('1','2','3','4','5','6','7','8','9','10',,,'10000')

typeが「ALL」になっていてテーブルスキャンになっていることがわかる

idselect_typetablepartitionstypepossible_keyskeykey_lenrefrowsfilteredExtra
1SIMPLEcompaniesNULLALLidx_nameNULLNULLNULL27156050Using where

まとめ