ORDER BY 狙いのキーについて動作確認メモ
こちらのスライドで説明されていることの理解を深めるために動作確認してみました。
www.slideshare.net
# 実験用に bulk insert でデータを入れる values_1 = (1..9990).to_a.map do |_| "(#{rand(80)}, 1)" end.join(", ") values_2 = (1..10).to_a.map do |_| "(#{rand(80)}, 0)" end.join(", ") [values_1, values_2].each do |v| system "mysql -u root spike -e 'INSERT INTO `users` ( `age`, `gender`) VALUES #{ v };'" end puts "success!"
EXPLAIN SELECT * FROM users WHERE gender = 1 ORDER BY age LIMIT 5 # 9990件 # WHERE gender = 0 ORDER BY age LIMIT 5 # 10件 # ORDER BY 狙いのインデックス idx_users__age が使われている # id select_type table type possible_keys key key_len ref rows Extra # 1 SIMPLE users INDEX idx_users__gender idx_users__age 4 NULL 5 USING WHERE # WHERE 狙いのインデックス idx_users__gender が使われている # * id select_type TABLE TYPE possible_keys KEY key_len ref ROWS Extra # 1 SIMPLE users ref idx_users__gender idx_users__gender 1 const 10 USING WHERE; USING filesort ;