u16suzuの blog

日々学んだことのメモブログです。

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
;