Successfully reported this slideshow.
MySQL  のチューニングについて考えてみた tokuhirom
MySQL  は遅いか速いか <ul><li>たぶん、速い。たいていの場合は。 </li></ul><ul><li>でもときどき遅い。 </li></ul>
遅い原因の見つけ方 <ul><li>Mysql  の  slow query log  をみる </li></ul><ul><li>表示に時間かかっているページをみつけて、そこのページの  SQL  を最適化してみたりする </li></ul>
EXPLAIN
EXPLAIN  を制するものは  MySQL  を制す
EXPLAIN の使い方 <ul><li>EXPLAIN SELECT COUNT(*) FROM foo; </li></ul><ul><li>id: 1 </li></ul><ul><li>select_type: SIMPLE </li>...
EXPLAINの見方 <ul><li>インデックスがきいてるか、どうか。 </li></ul><ul><li>possible_keys : NULL </li></ul><ul><li>key : NULL </li></ul>
JOIN が遅い。 <ul><li>SELECT * FROM a INNER JOIN b (b.a_id = a) … </li></ul><ul><li>4 つとか  JOIN  すると遅い。 </li></ul>
Using temporary; <ul><li>テンポラリーテーブルを作る。 </li></ul><ul><li>遅い。 </li></ul><ul><li>ユーザーが見てるページで、これがでてくるクエリを発行したらダメ。 </li></ul>
JOINを回避する方法 <ul><li>SELECT * FROM a INNER JOIN b (b.id=a.b_id); </li></ul><ul><li>を </li></ul><ul><li>SELECT * FROM a; </l...
How to implement <ul><li>my @rows = </li></ul><ul><li>  Proj::Schema::Foo </li></ul><ul><li>->fetch_with_cache_multi(@ids)...
get_multi  の考え方 <ul><li>Memcached  での考え方。 </li></ul><ul><li>複数キーで一気にひっぱってくる。 </li></ul>
fetch_with_cache_multi() <ul><li>local $DBIx::Class::ResultSourceHandle::thaw_schema = $c->model_slave; </li></ul><ul><li>...
fetch_with_cache_multi <ul><li>get_multi  する </li></ul><ul><li>とれなかった分は </li></ul><ul><ul><li>IN  でひっぱってくる。 </li></ul></ul...
set_multi? <ul><li>Cache::Memcached::Fast </li></ul>
なぜ multi だと速いのか <ul><li>select loop  をまわします。。。 </li></ul>
That’s all. <ul><li>Any questions? </li></ul>
Upcoming SlideShare
Loading in …5
×

MySQL のチューニングについて考えてみた

10,099 views

Published on

Published in: Technology
  • Be the first to comment

MySQL のチューニングについて考えてみた

  1. 1. MySQL のチューニングについて考えてみた tokuhirom
  2. 2. MySQL は遅いか速いか <ul><li>たぶん、速い。たいていの場合は。 </li></ul><ul><li>でもときどき遅い。 </li></ul>
  3. 3. 遅い原因の見つけ方 <ul><li>Mysql の slow query log をみる </li></ul><ul><li>表示に時間かかっているページをみつけて、そこのページの SQL を最適化してみたりする </li></ul>
  4. 4. EXPLAIN
  5. 5. EXPLAIN を制するものは MySQL を制す
  6. 6. EXPLAIN の使い方 <ul><li>EXPLAIN SELECT COUNT(*) FROM foo; </li></ul><ul><li>id: 1 </li></ul><ul><li>select_type: SIMPLE </li></ul><ul><li>table: NULL </li></ul><ul><li>type: NULL </li></ul><ul><li>possible_keys : NULL </li></ul><ul><li>key : NULL </li></ul><ul><li>key_len: NULL </li></ul><ul><li>ref: NULL </li></ul><ul><li>rows: NULL </li></ul><ul><li>Extra: Select tables optimized away </li></ul>
  7. 7. EXPLAINの見方 <ul><li>インデックスがきいてるか、どうか。 </li></ul><ul><li>possible_keys : NULL </li></ul><ul><li>key : NULL </li></ul>
  8. 8. JOIN が遅い。 <ul><li>SELECT * FROM a INNER JOIN b (b.a_id = a) … </li></ul><ul><li>4 つとか JOIN すると遅い。 </li></ul>
  9. 9. Using temporary; <ul><li>テンポラリーテーブルを作る。 </li></ul><ul><li>遅い。 </li></ul><ul><li>ユーザーが見てるページで、これがでてくるクエリを発行したらダメ。 </li></ul>
  10. 10. JOINを回避する方法 <ul><li>SELECT * FROM a INNER JOIN b (b.id=a.b_id); </li></ul><ul><li>を </li></ul><ul><li>SELECT * FROM a; </li></ul><ul><li>SELECT * FROM b WHERE id IN (?, ?, ?, ?); </li></ul><ul><li>に分割する。 </li></ul>
  11. 11. How to implement <ul><li>my @rows = </li></ul><ul><li> Proj::Schema::Foo </li></ul><ul><li>->fetch_with_cache_multi(@ids); </li></ul>
  12. 12. get_multi の考え方 <ul><li>Memcached での考え方。 </li></ul><ul><li>複数キーで一気にひっぱってくる。 </li></ul>
  13. 13. fetch_with_cache_multi() <ul><li>local $DBIx::Class::ResultSourceHandle::thaw_schema = $c->model_slave; </li></ul><ul><li>なんかやっとかないといけないらしい。 </li></ul>
  14. 14. fetch_with_cache_multi <ul><li>get_multi する </li></ul><ul><li>とれなかった分は </li></ul><ul><ul><li>IN でひっぱってくる。 </li></ul></ul><ul><ul><li>set_multi する </li></ul></ul><ul><li>まとめて返す。 </li></ul>
  15. 15. set_multi? <ul><li>Cache::Memcached::Fast </li></ul>
  16. 16. なぜ multi だと速いのか <ul><li>select loop をまわします。。。 </li></ul>
  17. 17. That’s all. <ul><li>Any questions? </li></ul>

×