チューニンガソン5の復讐
Upcoming SlideShare
Loading in...5
×
 

Like this? Share it with your network

Share

チューニンガソン5の復讐

on

  • 2,047 views

2013/07/29のMyNA会の資料です。

2013/07/29のMyNA会の資料です。
奥野さんのブログ記事の一部(CC-BY-NC-SA)を含んでいるため、CC-BY-NC-SAです。

Statistics

Views

Total Views
2,047
Views on SlideShare
1,394
Embed Views
653

Actions

Likes
3
Downloads
3
Comments
0

14 Embeds 653

http://yoku0825.blogspot.jp 606
http://cloud.feedly.com 12
http://yoku0825.blogspot.com 11
https://twitter.com 7
http://yoku0825.blogspot.kr 3
http://yoku0825.blogspot.ru 2
http://cheliped29.katinia.com 2
http://yoku0825.blogspot.fr 2
http://translate.googleusercontent.com 2
http://yoku0825.blogspot.de 2
http://yoku0825.blogspot.hk 1
http://yoku0825.blogspot.ca 1
http://webcache.googleusercontent.com 1
http://cheliped29.rssing.com 1
More...

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

CC Attribution-NonCommercial-ShareAlike LicenseCC Attribution-NonCommercial-ShareAlike LicenseCC Attribution-NonCommercial-ShareAlike License

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

チューニンガソン5の復讐 Presentation Transcript

  • 1. チューニンガソン5の復讐 ~SH2さんの宿題をやってみた~ 2013/07/29 MyNA July in 2013 yoku0825
  • 2. SH2さんのブログ記事 チューニンガソン5の復習 MySQL 5.5 チート編&勉強会のお知らせ http://d.hatena.ne.jp/sh2/20130304 に敬意を表して
  • 3. \こんばんは/ • I'm yoku0825, working as DBA for the company which provides web-services. • Husband of my wife :) • Father of my son :) • I love sushi more than yakiniku :) Of cource, I love yakiniku well. • MySQL? It's my delight :)
  • 4. 今日のテーマ • LTなので、チューニンガソン5の説明は省 略します。 – レギュレーションとかはゼロスタートさんの 広報ブログを http://pr.zero-start.jp/archives/65730135.html • 今回のチューニングはSH2さんのブログ記 事がベースです。 – http://d.hatena.ne.jp/sh2/20130304
  • 5. SH2さんのチューニング(?)
  • 6. やってみましょう
  • 7. 握 り つ ぶ し て い ま す
  • 8. 同じ文字列を返すようにできます
  • 9. まあなんというか
  • 10. ( ´-`).oO(MySQL Proxyでクエリ 書き換えはいくらなんでもあん まりだろう と思ったのは俺だけではないはず
  • 11. そんなアナタに贈る
  • 12. MySQL Proxyを使わずに mysqldを改造して クエリキャッシュに載せるライフ ハック Let's 魔改造
  • 13. 用意したもの • CentOS 6.3の仮想マシン。 – 1vCPU – 1GiB Memory – 230IOPSしかでなかった仮想DISK • MySQL 5.6.12 Source-Distributed • 男らしい潔さと大胆さ。 • 後ろを振り返らない勇ましさ。 • 最後は初心に返る謙虚さ。
  • 14. まずは吊るしのスコアを測定 $ python tgbench_mysql_2.py localhost Q0:0.00024 Q1:31.04855 Q2:21.24284 Q3:20.81227 Q4:81.48403 Q5:77.68560 Total:232.27354 $ python tgbench_mysql_2.py localhost Q0:0.00034 Q1:19.70425 Q2:19.93358 Q3:20.23704 Q4:76.66882 Q5:76.79747 Total:213.34149
  • 15. うわっ…私のMySQL、遅すぎ …? My MySQL is slower than your MySQL :(
  • 16. まあ、行きます。 まずはRESET QUERY CACHEを何とかしようず。
  • 17. RESET QUERY CACHEの回避 • RESET QUERY CACHEを処理する関数は Query_cache::flush() 2063 /* Remove all queries from cache */ 2064 2065 void Query_cache::flush() 2066 { 2067 DBUG_ENTER("Query_cache::flush"); 2068 if (is_disabled()) 2069 DBUG_VOID_RETURN; 2070 2071 QC_DEBUG_SYNC("wait_in_query_cache_flush1"); 2072 2073 lock_and_suspend(); 2074 if (query_cache_size > 0) 2075 { 2076 DUMP(this); 2077 flush_cache(); 2078 DUMP(this); 2079 } 2080 2081 DBUG_EXECUTE("check_querycache",query_cache.check_integrity(1);); 2082 unlock(); 2083 DBUG_VOID_RETURN; 2084 }
  • 18. RESET QUERY CACHEの回避 • 男らしい潔さと大胆さを発揮。 *************** *** 2064,2085 **** void Query_cache::flush() { - DBUG_ENTER("Query_cache::flush"); - if (is_disabled()) - DBUG_VOID_RETURN; - - QC_DEBUG_SYNC("wait_in_query_cache_flush1"); - - lock_and_suspend(); - if (query_cache_size > 0) - { - DUMP(this); - flush_cache(); - DUMP(this); - } - - DBUG_EXECUTE("check_querycache",query_cache.check_integrity(1);); - unlock(); DBUG_VOID_RETURN; } --- 2064,2069 ----
  • 19. Q3, Q4, Q5がクエリキャッシュから返るよう に $ python tgbench_mysql_2.py localhost Q0:0.00024 Q1:27.84138 Q2:20.36092 Q3:20.98092 Q4:81.70963 Q5:75.44204 Total:226.33513 $ python tgbench_mysql_2.py localhost Q0:0.00019 Q1:20.24178 Q2:20.76213 Q3:0.00057 Q4:0.11970 Q5:0.00879 Total:41.13317
  • 20. はい次。 NOW()関数を何とかしようず。
  • 21. NOW()関数の回避 • クエリーがクエリーキャッシュにのるべ きか否かを判定するのは Query_cache::is_cacheable 3702 TABLE_COUNTER_TYPE 3703 Query_cache::is_cacheable(THD *thd, size_t query_len, const char *query, 3704 LEX *lex, 3705 TABLE_LIST *tables_used, uint8 *tables_type) 3706 { 3707 TABLE_COUNTER_TYPE table_count; 3708 DBUG_ENTER("Query_cache::is_cacheable"); 3709 3710 if (query_cache_is_cacheable_query(lex) && 3711 (thd->variables.query_cache_type == 1 || 3712 (thd->variables.query_cache_type == 2 && (lex->select_lex.options & 3713 OPTION_TO_QUERY_CACHE)))) 3714 { .. 3720 if (!(table_count= process_and_count_tables(thd, tables_used, 3721 tables_type))) 3722 DBUG_RETURN(0); 3723 3724 if (thd->in_multi_stmt_transaction_mode() && 3725 ((*tables_type)&HA_CACHE_TBL_TRANSACT)) 3726 { 3727 DBUG_PRINT("qcache", ("not in autocommin mode")); 3728 DBUG_RETURN(0); 3729 } 3730 DBUG_PRINT("qcache", ("select is using %d tables", table_count));
  • 22. NOW()関数の回避 • 本当はNOW()だけ華麗にスルーしたかった けど、手が込みそうなので後ろを振り返 らない勇ましさを発揮。 *************** *** 3707,3716 **** TABLE_COUNTER_TYPE table_count; DBUG_ENTER("Query_cache::is_cacheable"); ! if (query_cache_is_cacheable_query(lex) && ! (thd->variables.query_cache_type == 1 || (thd->variables.query_cache_type == 2 && (lex->select_lex.options & ! OPTION_TO_QUERY_CACHE)))) { DBUG_PRINT("qcache", ("options: %lx %lx type: %u", (long) OPTION_TO_QUERY_CACHE, --- 3691,3699 ---- TABLE_COUNTER_TYPE table_count; DBUG_ENTER("Query_cache::is_cacheable"); ! if (thd->variables.query_cache_type == 1 || (thd->variables.query_cache_type == 2 && (lex->select_lex.options & ! OPTION_TO_QUERY_CACHE))) { DBUG_PRINT("qcache", ("options: %lx %lx type: %u", (long) OPTION_TO_QUERY_CACHE,
  • 23. Q2もクエリキャッシュから返るように $ python tgbench_mysql_2.py localhost Q0:0.00030 Q1:32.63952 Q2:21.20478 Q3:21.08606 Q4:82.93199 Q5:78.23889 Total:236.10153 $ python tgbench_mysql_2.py localhost Q0:0.00021 Q1:20.41031 Q2:0.00031 Q3:0.00014 Q4:0.11961 Q5:0.00984 Total:20.54041
  • 24. はい次。 AUTOCOMMITを何とかしようず。
  • 25. AUTOCOMMITの壁 • Bug #42197の壁 http://bugs.mysql.com/bug.php?id=42197 • 正直色々無理。 • 俺が直せるならとっくに直ってるだろ。 • vioでautocommitフラグを握りつぶそうかと 思ったけど、sql/sql_cache.ccの中で完結した かった。 • トランザクション周りの判定を色々変えてみ るも、そもそもmy_hash_searchで転んでるの でダメぽ。
  • 26. 結局
  • 27. 謙虚に初心に返ってみた • ALTER TABLE page Engine = MyISAM; • ALTER TABLE revision Engine = MyISAM; '`,、'`,、( ´∀`)'`,、'`,、
  • 28. これで全てがクエリキャッシュから返る $ python tgbench_mysql_2.py localhost Q0:0.00031 Q1:3.44232 Q2:2.98533 Q3:2.97978 Q4:29.55061 Q5:25.79326 Total:64.75160 $ python tgbench_mysql_2.py localhost Q0:0.00018 Q1:0.00016 Q2:0.00010 Q3:0.00033 Q4:0.11568 Q5:0.00785 Total:0.12431
  • 29. 副作用 $ time mysql -e "SELECT rev_id FROM wikipedia.revision ORDER BY RAND() LIMIT 5" +----------+ | rev_id | +----------+ | 43292141 | | 35737287 | | 45015288 | | 39406805 | | 44899598 | +----------+ real 0m4.259s user 0m0.006s sys 0m0.004s $ time mysql -e "SELECT rev_id FROM wikipedia.revision ORDER BY RAND() LIMIT 5" +----------+ | rev_id | +----------+ | 43292141 | | 35737287 | | 45015288 | | 39406805 | | 44899598 | +----------+ real 0m0.027s user 0m0.005s sys 0m0.005s
  • 30. ORDER BY RAND()でもクエリ キャッシュから返るからDISKに優 しい! orz
  • 31. 副作用 $ time mysql -e "SELECT rev_id, NOW() FROM wikipedia.revision LIMIT 5" +---------+---------------------+ | rev_id | NOW() | +---------+---------------------+ | 647678 | 2013-07-08 11:50:14 | | 2168855 | 2013-07-08 11:50:14 | | 2168856 | 2013-07-08 11:50:14 | | 2168894 | 2013-07-08 11:50:14 | | 2168972 | 2013-07-08 11:50:14 | +---------+---------------------+ real 0m0.031s user 0m0.007s sys 0m0.003s $ time mysql -e "SELECT rev_id, NOW() FROM wikipedia.revision LIMIT 5" +---------+---------------------+ | rev_id | NOW() | +---------+---------------------+ | 647678 | 2013-07-08 11:50:14 | | 2168855 | 2013-07-08 11:50:14 | | 2168856 | 2013-07-08 11:50:14 | | 2168894 | 2013-07-08 11:50:14 | | 2168972 | 2013-07-08 11:50:14 | +---------+---------------------+ real 0m0.011s user 0m0.005s sys 0m0.004s
  • 32. まるでREPEATABLE-READ!! orz
  • 33. 日本よ、これがMySQL 5.6 だッ!! (c) @nippondanji http://nippondanji.blogspot.jp/2012/ 10/mysql-56.html
  • 34. すいません調子乗りましたorz
  • 35. 今回の魔改造の副産物 というか、魔改造が副産物だけど
  • 36. information_schema.QUERY_CACHE_INFO • MariaDB 10.0.2, 5.5.31にもバックポートさ れた、クエリーキャッシュの中身を覗け るinformation_schemaプラグイン • 自力で書こうと頑張っていた頃に見つけ て見事にやる気をなくす • が、折角だからMySQLでも使えるように パッチした • 取り敢えずステージング環境に突っ込ん で使ってる
  • 37. こんな感じ mysql55> SELECT * FROM information_schema.query_cache_info LIMIT 3G *************************** 1. row *************************** STATEMENT_SCHEMA: tpcc STATEMENT_TEXT: SELECT i_price, i_name, i_data FROM item WHERE i_id = 16360 RESULT_BLOCKS_COUNT: 1 RESULT_BLOCKS_SIZE: 512 RESULT_BLOCKS_SIZE_USED: 298 *************************** 2. row *************************** STATEMENT_SCHEMA: tpcc STATEMENT_TEXT: SELECT i_price, i_name, i_data FROM item WHERE i_id = 39901 RESULT_BLOCKS_COUNT: 1 RESULT_BLOCKS_SIZE: 512 RESULT_BLOCKS_SIZE_USED: 297 *************************** 3. row *************************** STATEMENT_SCHEMA: tpcc STATEMENT_TEXT: SELECT i_price, i_name, i_data FROM item WHERE i_id = 2134 RESULT_BLOCKS_COUNT: 1 RESULT_BLOCKS_SIZE: 512 RESULT_BLOCKS_SIZE_USED: 302 3 rows in set (0.01 sec)
  • 38. パッチはこちら https://github.com/yoku0825/qc_info
  • 39. MariaDBのJIRAに インプリメントのパッチがあるので そのうち追加するかも あと5.6で動かないのでそれも
  • 40. MySQL 5.6ではデフォルトでoffに なりましたが しかも(for performance reasons)って 中の人に書かれてたり。 知ってるけどさ(つд`) http://bugs.mysql.com/bug.php?id=68241
  • 41. 読んでみると意外と面白かっ たりします よく知られたところだから、 想定する動作が判るってのが大き い
  • 42. \宣伝/
  • 43. スパスパMySQLやりたい ( ´∀`)y-~~ ↑このへんがス パスパ
  • 44. 本家 • 過去のイベントです。 • http://atnd.org/events/33779 • ハッシュタグなんてあったんですね!? #gdgdmysql • 参加されている面子的に、煙草飲みには肩身が狭そうな気配。 • 煙草もやめられないけどMySQLもやめられない。
  • 45. じゃあ作るしかない
  • 46. というわけでスパスパMySQL 9月上旬にやるつもりです。 参加しても良いよって方は @yoku0825までメンション下さい。
  • 47. ご清聴ありがとうございまし た