データベースを使おう

Shuhei Iitsuka
Shuhei IitsukaUX Engineer at Google
データベースを使おう	

 InnoDB	
  でやるお (^ω^)
テスト用にデータベースを	
  
                    用意しました	
•  friend	
  (約 1000	
  万件)	
  
     –    user_id	
  VARCHAR(128)	
  
     –    friend_id	
  VARCHAR(128)	
  
     –    …	
  
     –    PRIMARY	
  KEY	
  (user_id,	
  friend_id)	
  
     –    UNIQUE	
  KEY	
  (friend_id,	
  user_id)	
  
•  user	
  (約 100	
  万件)	
  
     –    id	
  VARCHAR(128)	
  
     –    name	
  VARCHAR(256)	
  
     –    gender_id	
  INT	
  UNSIGNED	
  
     –    lang	
  VARCHAR(10)	
  
     –    created_at	
  DATETIME	
  
     –    …	
  
     –    PRIMARY	
  KEY	
  (id)	
  
試してみよう	
•  普通の SELECT	
  文	
  
   –  SELECT	
  *	
  FROM	
  user	
  LIMIT	
  10;	
  
   –  SELECT	
  *	
  FROM	
  user;	
  
•  条件指定	
  
   –  SELECT	
  *	
  FROM	
  user	
  WHERE	
  id	
  =	
  
      '109092915251428393573';	
  
   –  SELECT	
  *	
  FROM	
  user	
  WHERE	
  name	
  =	
  '天野仁史';	
  
   –  SELECT	
  id,	
  name	
  FROM	
  user	
  WHERE	
  created_at	
  >	
  
      DATE_SUB(NOW(),	
  INTERVAL	
  10	
  MINUTE);	
  
•  同姓同名ランキング	
  
   –  SELECT	
  user.name,	
  COUNT(id)	
  FROM	
  user	
  GROUP	
  BY	
  
      user.name	
  ORDER	
  BY	
  COUNT(id)	
  DESC	
  LIMIT	
  10;	
  
試してみよう	
•  従業員数ランキング	
  
   –  SELECT	
  company.id,	
  company.name,	
  COUNT(user_employment.id)	
  
      FROM	
  user_employment	
  LEFT	
  JOIN	
  company	
  ON	
  
      user_employment.company_id	
  =	
  company.id	
  GROUP	
  BY	
  company.id	
  
      ORDER	
  BY	
  COUNT(user_employment.id)	
  DESC	
  LIMIT	
  10;	
  
•  企業の従業員一覧	
  
   –  SELECT	
  user.id,	
  user.name	
  FROM	
  user	
  LEFT	
  JOIN	
  user_employment	
  
      ON	
  user.id	
  =	
  user_employment.user_id	
  LEFT	
  JOIN	
  company	
  ON	
  
      user_employment.company_id	
  =	
  company.id	
  WHERE	
  company.name	
  
      =	
  'Google';	
  
•  共通の友達	
  
   –  SELECT	
  *	
  FROM	
  friend	
  AS	
  f1	
  LEFT	
  JOIN	
  friend	
  AS	
  f2	
  ON	
  f1.friend_id	
  =	
  
      f2.user_id	
  WHERE	
  f1.user_id	
  =	
  '109092915251428393573'	
  AND	
  
      f2.friend_id	
  =	
  '113100517422007103669'	
  
想像してみよう	
       Id	
                 name	
                   gender_id	
 lang	
              created_at	
       1	
                  佐藤太郎	
                   1	
                 ja	
        2011-­‐01-­‐01	
  22:32:44	
       2	
                  鈴木花子	
                   0	
                 en	
        2011-­‐01-­‐01	
  23:32:44	
       3	
                  山田二郎	
                   1	
                 id	
        2011-­‐01-­‐03	
  22:32:44	
       4	
                  天野仁史	
                   1	
                 zh-­‐cn	
 2011-­‐01-­‐05	
  22:32:44	
       5	
                  飯塚修平	
                   1	
                 zh-­‐tw	
 2011-­‐01-­‐06	
  22:32:44	
       …	
                  …	
                      …	
                 …	
       123013810	
 猫ひろし	
                            1	
                 en	
        2011-­‐12-­‐31	
  22:32:44	
  


SELECT	
  *	
  FROM	
  user	
  WHERE	
  created_at	
  <	
  '2011-­‐08-­‐01'	
  LIMIT	
  10;	
  
想像してみよう	
       Id	
                 name	
                   gender_id	
 lang	
              created_at	
       1	
          佐藤太郎	
                           1	
                 ja	
        2011-­‐01-­‐01	
  22:32:44	
           10	
  件見つかるま
       2	
          鈴木花子	
                           0	
                 en	
        2011-­‐01-­‐01	
  23:32:44	
             で探すぜ!	
  
       3	
          山田二郎	
                           1	
                 id	
        2011-­‐01-­‐03	
  22:32:44	
       4	
                  天野仁史	
                   1	
                 zh-­‐cn	
 2011-­‐01-­‐05	
  22:32:44	
       5	
                  飯塚修平	
                   1	
                 zh-­‐tw	
 2011-­‐01-­‐06	
  22:32:44	
       …	
                  …	
                      …	
                 …	
       123013810	
 猫ひろし	
                            1	
                 en	
        2011-­‐12-­‐31	
  22:32:44	
  


SELECT	
  *	
  FROM	
  user	
  WHERE	
  created_at	
  <	
  '2011-­‐08-­‐01'	
  LIMIT	
  10;	
  
                                                                                                      遅いよね
想像してみよう	
                       8	
                                Id	
     name	
                                                    2	
  分木で 2	
  分探                    gender_id	
 lang	
     created_at	
                                                          1	
      佐藤太郎	
               1	
         ja	
       2011-­‐01-­‐01	
  22:32:44	
                                                         索するぜ!	
  
                                                           2	
          鈴木花子	
          0	
         en	
       2011-­‐01-­‐01	
  23:32:44	
                4	
          12	
                          3	
          山田二郎	
          1	
         id	
       2011-­‐01-­‐03	
  22:32:44	
                                                           4	
          天野仁史	
          1	
         zh-­‐cn	
 2011-­‐01-­‐05	
  22:32:44	

         2	
          6	
                                  5	
          飯塚修平	
          1	
         zh-­‐tw	
 2011-­‐01-­‐06	
  22:32:44	
                                                           …	
          …	
             …	
         …	
                                                           123013810	
 猫ひろし	
           1	
         en	
       2011-­‐12-­‐31	
  22:32:44	
  




SELECT	
  *	
  FROM	
  user	
  WHERE	
  created_at	
  <	
  '2011-­‐08-­‐01'	
  LIMIT	
  10;	
  
                                                                                                    あたまいいね
インデックスの仕組み	
•  B+	
  木	
  
    –  探索が速くなる	
  
         •  O(n/2)	
  →	
  O(log(n))	
  
    –  挿入は遅くなる	
  
         •  O(1)	
  → O(log(n))	
  

                                           wikipedia:	
  B+ 木から	
•  ハッシュ関数を使う場合もあるよ	
  
    –  検索も挿入も O(1)	
  
    –  範囲検索はできない	
  
複合インデックス	
•  複数のカラムに条件を指定して探索したい場
   合は、複合インデックスを使う	
  
•  二つのキーを、上下の桁として合わせた値に
   対して木が作られるので、順番が大切	
  
 –  どちらが上の桁で、下の桁になるかが重要	
  
EXPLAIN	
•  select_type	
  
      –  サブクエリの種類	
  
      –  DEPENDENT	
  SUBQUERY,	
  UNCACHEABLE	
  SUBQUERY	
  は要改善	
  
•  type	
  
      –  const	
  
              •  primary	
  key	
  や unique	
  index	
  を探索に使う	
  
      –  eq_ref	
  
              •  JOIN	
  に primary	
  key	
  や unique	
  index	
  を使ってる	
  
      –  range	
  
              •  インデックスを使った範囲	
  
      –  ref	
  
              •  インデックス使ってる	
  
      –  index	
  
              •  フルインデックススキャン。要改善	
  
      –  ALL	
  
              •  フルテーブルスキャン。要改善	
  
•  key	
  
      –  実際に使われるインデックス	
  
DEPENDENT	
  SUBQUERY	
•  WHERE	
  IN	
  (SUBQUERY)	
  は遅い	
  
   –  このクエリが	
  
      •  SELECT	
  user_id	
  FROM	
  friend	
  WHERE	
  user_id	
  IN	
  (SELECT	
  
         friend_id	
  FROM	
  friend	
  WHERE	
  user_id	
  =	
  '	
  
         109092915251428393573	
  ')	
  AND	
  friend_id	
  =	
  '	
  
         113100517422007103669';	
  
   –  以下のクエリに変更される	
  
      •  SELECT	
  user_id	
  FROM	
  friend	
  AS	
  f1	
  EXISTS	
  (SELECT	
  1	
  FROM	
  
         friend	
  AS	
  f2	
  WHERE	
  f2.user_id	
  =	
  '	
  109092915251428393573	
  
         '	
  AND	
  f2.friend_id	
  =	
  f1.user_id)	
  AND	
  f1.friend_id	
  =	
  
         '113100517422007103669';	
  
•  hmp://nippondanji.blogspot.com/2009/03/
   mysql_25.html	
  を参考に
トランザクションを知ろう	
•  処理途中の中途半端な状態が、影響しないようにすること	
  
     –  アトミック性 (Atomicity)	
  
          •  トランザクションに含まれるタスクが全て実行されるか、あるいは全く実行され
             ないことを保証する	
  
     –  一貫性 (Consistency)	
  
          •  トランザクション終了時に与えられたルールを守っている。	
  
          •  外部キー制約など	
  
     –  分離性 (Isolaoon)	
  
          •  処理が直列化されている	
  
          •  速度が犠牲になるため、独立性を一部しか実装しないことが多い	
  
               –  トランザクション分離レベル	
  
     –  永続性 (Durability)	
  
          •  クラッシュしても一度コミットされたデータは復元できる	
  

(wikipedia:	
  ACID	
  から)	
  
トランザクション分離レベル	
•  SERIALIZABLE	
  
    –  完全に分離性を実現	
  
•  REPEATABLE	
  READ	
  (InnoDB	
  のデフォルト)	
  
    –  一度、読んだデータが変更されることがない	
  
    –  ファントムリード	
  
•  READ	
  COMMITTED	
  
    –  常にコミット済みのデータのみを読み取る	
  
    –  ファントムリード	
  
    –  ファジーリード	
  
•  READ	
  UNCOMMITTED	
  
    –  ファントムリード	
  
    –  ファジーリード	
  
    –  ダーティリード	
  
異常な読み込み	
•  ダーティリード	
  
  –  他のトランザクションが ROLLBACK	
  したはずなの
     に、読めてる	
  
•  ファジーリード	
  
  –  同じ行を 2	
  回読んだとき、その間に他のトランザ
     クションが値を変更したのが読めてしまう	
  
•  ファントムリード	
  
  –  同じ条件で行を読んだのに、他のトランザクション
     による挿入で、1回目と2回目で結果が変わる
ロック	
•  InnoDB	
  
   –  X	
  (排他)ロック	
  
       •  DELETE,	
  	
  UPDATE,	
  	
  INSERT	
  ,	
  	
  SELECT	
  FOR	
  UPDATE	
  
   –  S	
  (共有)ロック	
  
       •  SELECT	
  …	
  FROM	
  …	
  LOCK	
  IN	
  SHARE	
  MODE	
  
   –  一貫非ロック読み取り	
  
       •  SELECT	
  …	
  FROM	
  …
ロックの監視	
   •  /etc/my.cnf	
  
ignore-­‐builtin-­‐innodb	
  
plugin-­‐
load=innodb=ha_innodb_plugin.so;innodb_trx=ha_innodb_plugin.so;innodb_locks=ha_innod
b_plugin.so;innodb_lock_waits=ha_innodb_plugin.so;innodb_cmp=ha_innodb_plugin.so;inn
odb_cmp_reset=ha_innodb_plugin.so;innodb_cmpmem=ha_innodb_plugin.so;innodb_cmpmem_re
set=ha_innodb_plugin.so	
  


SELECT	
  *	
  FROM	
  information_schema.INNODB_LOCKS;	
  
1 of 16

Recommended

ADVENTURE_Solid-1.2 構造体リファレンスマニュアル by
ADVENTURE_Solid-1.2 構造体リファレンスマニュアルADVENTURE_Solid-1.2 構造体リファレンスマニュアル
ADVENTURE_Solid-1.2 構造体リファレンスマニュアルADVENTURE Project
148 views19 slides
【第3回初心者勉強会】データベースを使おう by
【第3回初心者勉強会】データベースを使おう【第3回初心者勉強会】データベースを使おう
【第3回初心者勉強会】データベースを使おうShuhei Iitsuka
1.1K views25 slides
お花サプライズ! by
お花サプライズ!お花サプライズ!
お花サプライズ!Shuhei Iitsuka
474 views23 slides
Improving the Sensitivity of Online Controlled Experiments by Utilizing Pre-E... by
Improving the Sensitivity of Online Controlled Experiments by Utilizing Pre-E...Improving the Sensitivity of Online Controlled Experiments by Utilizing Pre-E...
Improving the Sensitivity of Online Controlled Experiments by Utilizing Pre-E...Shuhei Iitsuka
967 views21 slides
Asia Trend Map: Forecasting “Cool Japan” Content Popularity on Web Data by
Asia Trend Map: Forecasting “Cool Japan” Content Popularity on Web DataAsia Trend Map: Forecasting “Cool Japan” Content Popularity on Web Data
Asia Trend Map: Forecasting “Cool Japan” Content Popularity on Web DataShuhei Iitsuka
1.6K views11 slides
Git by
GitGit
GitShuhei Iitsuka
1.5K views36 slides

More Related Content

Viewers also liked

Ruby on Rails の規約 by
Ruby on Rails の規約Ruby on Rails の規約
Ruby on Rails の規約Shuhei Iitsuka
2.2K views16 slides
ウェブサービスの企画とデザイン by
ウェブサービスの企画とデザインウェブサービスの企画とデザイン
ウェブサービスの企画とデザインShuhei Iitsuka
3.2K views58 slides
UT Startup Gym ウェブサービスを考える by
UT Startup Gym ウェブサービスを考えるUT Startup Gym ウェブサービスを考える
UT Startup Gym ウェブサービスを考えるShuhei Iitsuka
976 views39 slides
РАННИ БИОМАРКЕРИ ЗА БЪБРЕЧНО УВРЕЖДАНЕ by
РАННИ БИОМАРКЕРИ ЗА БЪБРЕЧНО УВРЕЖДАНЕ РАННИ БИОМАРКЕРИ ЗА БЪБРЕЧНО УВРЕЖДАНЕ
РАННИ БИОМАРКЕРИ ЗА БЪБРЕЧНО УВРЕЖДАНЕ ProMed
920 views33 slides
Уролитиаза - остра бъбречна колика при уретеролитиаза by
Уролитиаза - остра бъбречна колика при уретеролитиазаУролитиаза - остра бъбречна колика при уретеролитиаза
Уролитиаза - остра бъбречна колика при уретеролитиазаProMed
921 views21 slides
Изследване на урина, уринен седимент, хематурия (диагностични аспекти) by
Изследване на урина, уринен седимент, хематурия (диагностични аспекти)Изследване на урина, уринен седимент, хематурия (диагностични аспекти)
Изследване на урина, уринен седимент, хематурия (диагностични аспекти)ProMed
8K views83 slides

Viewers also liked(11)

ウェブサービスの企画とデザイン by Shuhei Iitsuka
ウェブサービスの企画とデザインウェブサービスの企画とデザイン
ウェブサービスの企画とデザイン
Shuhei Iitsuka3.2K views
UT Startup Gym ウェブサービスを考える by Shuhei Iitsuka
UT Startup Gym ウェブサービスを考えるUT Startup Gym ウェブサービスを考える
UT Startup Gym ウェブサービスを考える
Shuhei Iitsuka976 views
РАННИ БИОМАРКЕРИ ЗА БЪБРЕЧНО УВРЕЖДАНЕ by ProMed
РАННИ БИОМАРКЕРИ ЗА БЪБРЕЧНО УВРЕЖДАНЕ РАННИ БИОМАРКЕРИ ЗА БЪБРЕЧНО УВРЕЖДАНЕ
РАННИ БИОМАРКЕРИ ЗА БЪБРЕЧНО УВРЕЖДАНЕ
ProMed920 views
Уролитиаза - остра бъбречна колика при уретеролитиаза by ProMed
Уролитиаза - остра бъбречна колика при уретеролитиазаУролитиаза - остра бъбречна колика при уретеролитиаза
Уролитиаза - остра бъбречна колика при уретеролитиаза
ProMed921 views
Изследване на урина, уринен седимент, хематурия (диагностични аспекти) by ProMed
Изследване на урина, уринен седимент, хематурия (диагностични аспекти)Изследване на урина, уринен седимент, хематурия (диагностични аспекти)
Изследване на урина, уринен седимент, хематурия (диагностични аспекти)
ProMed8K views
Съвременни насоки, алгоритми и тенденции в лечението на простатния аденокарцином by ProMed
Съвременни насоки, алгоритми и тенденции в лечението на простатния аденокарциномСъвременни насоки, алгоритми и тенденции в лечението на простатния аденокарцином
Съвременни насоки, алгоритми и тенденции в лечението на простатния аденокарцином
ProMed1.6K views
Полулунни гломерулонефрити (имуннхистологични аспекти) by ProMed
Полулунни гломерулонефрити (имуннхистологични аспекти)Полулунни гломерулонефрити (имуннхистологични аспекти)
Полулунни гломерулонефрити (имуннхистологични аспекти)
ProMed1.7K views
かんたんキレイなウェブデザイン by Shuhei Iitsuka
かんたんキレイなウェブデザインかんたんキレイなウェブデザイン
かんたんキレイなウェブデザイン
Shuhei Iitsuka3.5K views
Generating sentences from a continuous space by Shuhei Iitsuka
Generating sentences from a continuous spaceGenerating sentences from a continuous space
Generating sentences from a continuous space
Shuhei Iitsuka2.1K views
ウェブから情報をあつめる by Shuhei Iitsuka
ウェブから情報をあつめるウェブから情報をあつめる
ウェブから情報をあつめる
Shuhei Iitsuka10.7K views

More from Shuhei Iitsuka

Online and offline handwritten chinese character recognition a comprehensive... by
Online and offline handwritten chinese character recognition  a comprehensive...Online and offline handwritten chinese character recognition  a comprehensive...
Online and offline handwritten chinese character recognition a comprehensive...Shuhei Iitsuka
397 views7 slides
Inferring win–lose product network from user behavior by
Inferring win–lose product network from user behaviorInferring win–lose product network from user behavior
Inferring win–lose product network from user behaviorShuhei Iitsuka
551 views14 slides
バリエーションの提示がもたらす長期的効果に着目したウェブサイト最適化手法 @第31回人工知能学会全国大会 by
バリエーションの提示がもたらす長期的効果に着目したウェブサイト最適化手法 @第31回人工知能学会全国大会バリエーションの提示がもたらす長期的効果に着目したウェブサイト最適化手法 @第31回人工知能学会全国大会
バリエーションの提示がもたらす長期的効果に着目したウェブサイト最適化手法 @第31回人工知能学会全国大会Shuhei Iitsuka
574 views15 slides
Procedural modeling using autoencoder networks by
Procedural modeling using autoencoder networksProcedural modeling using autoencoder networks
Procedural modeling using autoencoder networksShuhei Iitsuka
786 views22 slides
ウェブサイト最適化のためのバリエーション自動生成システム by
ウェブサイト最適化のためのバリエーション自動生成システムウェブサイト最適化のためのバリエーション自動生成システム
ウェブサイト最適化のためのバリエーション自動生成システムShuhei Iitsuka
1.2K views17 slides
Python と Xpath で ウェブからデータをあつめる by
Python と Xpath で ウェブからデータをあつめるPython と Xpath で ウェブからデータをあつめる
Python と Xpath で ウェブからデータをあつめるShuhei Iitsuka
6.2K views10 slides

More from Shuhei Iitsuka(20)

Online and offline handwritten chinese character recognition a comprehensive... by Shuhei Iitsuka
Online and offline handwritten chinese character recognition  a comprehensive...Online and offline handwritten chinese character recognition  a comprehensive...
Online and offline handwritten chinese character recognition a comprehensive...
Shuhei Iitsuka397 views
Inferring win–lose product network from user behavior by Shuhei Iitsuka
Inferring win–lose product network from user behaviorInferring win–lose product network from user behavior
Inferring win–lose product network from user behavior
Shuhei Iitsuka551 views
バリエーションの提示がもたらす長期的効果に着目したウェブサイト最適化手法 @第31回人工知能学会全国大会 by Shuhei Iitsuka
バリエーションの提示がもたらす長期的効果に着目したウェブサイト最適化手法 @第31回人工知能学会全国大会バリエーションの提示がもたらす長期的効果に着目したウェブサイト最適化手法 @第31回人工知能学会全国大会
バリエーションの提示がもたらす長期的効果に着目したウェブサイト最適化手法 @第31回人工知能学会全国大会
Shuhei Iitsuka574 views
Procedural modeling using autoencoder networks by Shuhei Iitsuka
Procedural modeling using autoencoder networksProcedural modeling using autoencoder networks
Procedural modeling using autoencoder networks
Shuhei Iitsuka786 views
ウェブサイト最適化のためのバリエーション自動生成システム by Shuhei Iitsuka
ウェブサイト最適化のためのバリエーション自動生成システムウェブサイト最適化のためのバリエーション自動生成システム
ウェブサイト最適化のためのバリエーション自動生成システム
Shuhei Iitsuka1.2K views
Python と Xpath で ウェブからデータをあつめる by Shuhei Iitsuka
Python と Xpath で ウェブからデータをあつめるPython と Xpath で ウェブからデータをあつめる
Python と Xpath で ウェブからデータをあつめる
Shuhei Iitsuka6.2K views
リミックスからはじめる DTM 入門 by Shuhei Iitsuka
リミックスからはじめる DTM 入門リミックスからはじめる DTM 入門
リミックスからはじめる DTM 入門
Shuhei Iitsuka17K views
【DBDA 勉強会 2013 夏】Chapter 12: Bayesian Approaches to Testing a Point (‘‘Null’’... by Shuhei Iitsuka
【DBDA 勉強会 2013 夏】Chapter 12: Bayesian Approaches to Testing a Point (‘‘Null’’...【DBDA 勉強会 2013 夏】Chapter 12: Bayesian Approaches to Testing a Point (‘‘Null’’...
【DBDA 勉強会 2013 夏】Chapter 12: Bayesian Approaches to Testing a Point (‘‘Null’’...
Shuhei Iitsuka3.1K views
【DBDA 勉強会 2013 夏】Doing Bayesian Data Analysis Chapter 4: Bayes’ Rule by Shuhei Iitsuka
【DBDA 勉強会 2013 夏】Doing Bayesian Data Analysis Chapter 4: Bayes’ Rule【DBDA 勉強会 2013 夏】Doing Bayesian Data Analysis Chapter 4: Bayes’ Rule
【DBDA 勉強会 2013 夏】Doing Bayesian Data Analysis Chapter 4: Bayes’ Rule
Shuhei Iitsuka6.8K views
ウェブサイトで収益を得る by Shuhei Iitsuka
ウェブサイトで収益を得るウェブサイトで収益を得る
ウェブサイトで収益を得る
Shuhei Iitsuka930 views
HTML で自己紹介ページをつくる by Shuhei Iitsuka
HTML で自己紹介ページをつくるHTML で自己紹介ページをつくる
HTML で自己紹介ページをつくる
Shuhei Iitsuka5.7K views
データベースを使おう by Shuhei Iitsuka
データベースを使おうデータベースを使おう
データベースを使おう
Shuhei Iitsuka9.9K views
第3期キックオフ説明会+勉強会 by Shuhei Iitsuka
第3期キックオフ説明会+勉強会 第3期キックオフ説明会+勉強会
第3期キックオフ説明会+勉強会
Shuhei Iitsuka710 views
かんたん Twitter アプリをつくろう by Shuhei Iitsuka
かんたん Twitter アプリをつくろう かんたん Twitter アプリをつくろう
かんたん Twitter アプリをつくろう
Shuhei Iitsuka1.2K views
ペルソナシナリオとプロトタイプ by Shuhei Iitsuka
ペルソナシナリオとプロトタイプペルソナシナリオとプロトタイプ
ペルソナシナリオとプロトタイプ
Shuhei Iitsuka3K views
ペルソナシナリオとプロトタイプ2 by Shuhei Iitsuka
ペルソナシナリオとプロトタイプ2ペルソナシナリオとプロトタイプ2
ペルソナシナリオとプロトタイプ2
Shuhei Iitsuka1.3K views
UT Startup Gym とは @第2期製品発表 by Shuhei Iitsuka
UT Startup Gym とは @第2期製品発表 UT Startup Gym とは @第2期製品発表
UT Startup Gym とは @第2期製品発表
Shuhei Iitsuka557 views

データベースを使おう

  • 2. テスト用にデータベースを   用意しました •  friend  (約 1000  万件)   –  user_id  VARCHAR(128)   –  friend_id  VARCHAR(128)   –  …   –  PRIMARY  KEY  (user_id,  friend_id)   –  UNIQUE  KEY  (friend_id,  user_id)   •  user  (約 100  万件)   –  id  VARCHAR(128)   –  name  VARCHAR(256)   –  gender_id  INT  UNSIGNED   –  lang  VARCHAR(10)   –  created_at  DATETIME   –  …   –  PRIMARY  KEY  (id)  
  • 3. 試してみよう •  普通の SELECT  文   –  SELECT  *  FROM  user  LIMIT  10;   –  SELECT  *  FROM  user;   •  条件指定   –  SELECT  *  FROM  user  WHERE  id  =   '109092915251428393573';   –  SELECT  *  FROM  user  WHERE  name  =  '天野仁史';   –  SELECT  id,  name  FROM  user  WHERE  created_at  >   DATE_SUB(NOW(),  INTERVAL  10  MINUTE);   •  同姓同名ランキング   –  SELECT  user.name,  COUNT(id)  FROM  user  GROUP  BY   user.name  ORDER  BY  COUNT(id)  DESC  LIMIT  10;  
  • 4. 試してみよう •  従業員数ランキング   –  SELECT  company.id,  company.name,  COUNT(user_employment.id)   FROM  user_employment  LEFT  JOIN  company  ON   user_employment.company_id  =  company.id  GROUP  BY  company.id   ORDER  BY  COUNT(user_employment.id)  DESC  LIMIT  10;   •  企業の従業員一覧   –  SELECT  user.id,  user.name  FROM  user  LEFT  JOIN  user_employment   ON  user.id  =  user_employment.user_id  LEFT  JOIN  company  ON   user_employment.company_id  =  company.id  WHERE  company.name   =  'Google';   •  共通の友達   –  SELECT  *  FROM  friend  AS  f1  LEFT  JOIN  friend  AS  f2  ON  f1.friend_id  =   f2.user_id  WHERE  f1.user_id  =  '109092915251428393573'  AND   f2.friend_id  =  '113100517422007103669'  
  • 5. 想像してみよう Id name gender_id lang created_at 1 佐藤太郎 1 ja 2011-­‐01-­‐01  22:32:44 2 鈴木花子 0 en 2011-­‐01-­‐01  23:32:44 3 山田二郎 1 id 2011-­‐01-­‐03  22:32:44 4 天野仁史 1 zh-­‐cn 2011-­‐01-­‐05  22:32:44 5 飯塚修平 1 zh-­‐tw 2011-­‐01-­‐06  22:32:44 … … … … 123013810 猫ひろし 1 en   2011-­‐12-­‐31  22:32:44   SELECT  *  FROM  user  WHERE  created_at  <  '2011-­‐08-­‐01'  LIMIT  10;  
  • 6. 想像してみよう Id name gender_id lang created_at 1 佐藤太郎 1 ja 2011-­‐01-­‐01  22:32:44 10  件見つかるま 2 鈴木花子 0 en 2011-­‐01-­‐01  23:32:44 で探すぜ!   3 山田二郎 1 id 2011-­‐01-­‐03  22:32:44 4 天野仁史 1 zh-­‐cn 2011-­‐01-­‐05  22:32:44 5 飯塚修平 1 zh-­‐tw 2011-­‐01-­‐06  22:32:44 … … … … 123013810 猫ひろし 1 en   2011-­‐12-­‐31  22:32:44   SELECT  *  FROM  user  WHERE  created_at  <  '2011-­‐08-­‐01'  LIMIT  10;   遅いよね
  • 7. 想像してみよう 8 Id name 2  分木で 2  分探 gender_id lang created_at 1 佐藤太郎 1 ja 2011-­‐01-­‐01  22:32:44 索するぜ!   2 鈴木花子 0 en 2011-­‐01-­‐01  23:32:44 4 12 3 山田二郎 1 id 2011-­‐01-­‐03  22:32:44 4 天野仁史 1 zh-­‐cn 2011-­‐01-­‐05  22:32:44 2 6 5 飯塚修平 1 zh-­‐tw 2011-­‐01-­‐06  22:32:44 … … … … 123013810 猫ひろし 1 en   2011-­‐12-­‐31  22:32:44   SELECT  *  FROM  user  WHERE  created_at  <  '2011-­‐08-­‐01'  LIMIT  10;   あたまいいね
  • 8. インデックスの仕組み •  B+  木   –  探索が速くなる   •  O(n/2)  →  O(log(n))   –  挿入は遅くなる   •  O(1)  → O(log(n))   wikipedia:  B+ 木から •  ハッシュ関数を使う場合もあるよ   –  検索も挿入も O(1)   –  範囲検索はできない  
  • 9. 複合インデックス •  複数のカラムに条件を指定して探索したい場 合は、複合インデックスを使う   •  二つのキーを、上下の桁として合わせた値に 対して木が作られるので、順番が大切   –  どちらが上の桁で、下の桁になるかが重要  
  • 10. EXPLAIN •  select_type   –  サブクエリの種類   –  DEPENDENT  SUBQUERY,  UNCACHEABLE  SUBQUERY  は要改善   •  type   –  const   •  primary  key  や unique  index  を探索に使う   –  eq_ref   •  JOIN  に primary  key  や unique  index  を使ってる   –  range   •  インデックスを使った範囲   –  ref   •  インデックス使ってる   –  index   •  フルインデックススキャン。要改善   –  ALL   •  フルテーブルスキャン。要改善   •  key   –  実際に使われるインデックス  
  • 11. DEPENDENT  SUBQUERY •  WHERE  IN  (SUBQUERY)  は遅い   –  このクエリが   •  SELECT  user_id  FROM  friend  WHERE  user_id  IN  (SELECT   friend_id  FROM  friend  WHERE  user_id  =  '   109092915251428393573  ')  AND  friend_id  =  '   113100517422007103669';   –  以下のクエリに変更される   •  SELECT  user_id  FROM  friend  AS  f1  EXISTS  (SELECT  1  FROM   friend  AS  f2  WHERE  f2.user_id  =  '  109092915251428393573   '  AND  f2.friend_id  =  f1.user_id)  AND  f1.friend_id  =   '113100517422007103669';   •  hmp://nippondanji.blogspot.com/2009/03/ mysql_25.html  を参考に
  • 12. トランザクションを知ろう •  処理途中の中途半端な状態が、影響しないようにすること   –  アトミック性 (Atomicity)   •  トランザクションに含まれるタスクが全て実行されるか、あるいは全く実行され ないことを保証する   –  一貫性 (Consistency)   •  トランザクション終了時に与えられたルールを守っている。   •  外部キー制約など   –  分離性 (Isolaoon)   •  処理が直列化されている   •  速度が犠牲になるため、独立性を一部しか実装しないことが多い   –  トランザクション分離レベル   –  永続性 (Durability)   •  クラッシュしても一度コミットされたデータは復元できる   (wikipedia:  ACID  から)  
  • 13. トランザクション分離レベル •  SERIALIZABLE   –  完全に分離性を実現   •  REPEATABLE  READ  (InnoDB  のデフォルト)   –  一度、読んだデータが変更されることがない   –  ファントムリード   •  READ  COMMITTED   –  常にコミット済みのデータのみを読み取る   –  ファントムリード   –  ファジーリード   •  READ  UNCOMMITTED   –  ファントムリード   –  ファジーリード   –  ダーティリード  
  • 14. 異常な読み込み •  ダーティリード   –  他のトランザクションが ROLLBACK  したはずなの に、読めてる   •  ファジーリード   –  同じ行を 2  回読んだとき、その間に他のトランザ クションが値を変更したのが読めてしまう   •  ファントムリード   –  同じ条件で行を読んだのに、他のトランザクション による挿入で、1回目と2回目で結果が変わる
  • 15. ロック •  InnoDB   –  X  (排他)ロック   •  DELETE,    UPDATE,    INSERT  ,    SELECT  FOR  UPDATE   –  S  (共有)ロック   •  SELECT  …  FROM  …  LOCK  IN  SHARE  MODE   –  一貫非ロック読み取り   •  SELECT  …  FROM  …
  • 16. ロックの監視 •  /etc/my.cnf   ignore-­‐builtin-­‐innodb   plugin-­‐ load=innodb=ha_innodb_plugin.so;innodb_trx=ha_innodb_plugin.so;innodb_locks=ha_innod b_plugin.so;innodb_lock_waits=ha_innodb_plugin.so;innodb_cmp=ha_innodb_plugin.so;inn odb_cmp_reset=ha_innodb_plugin.so;innodb_cmpmem=ha_innodb_plugin.so;innodb_cmpmem_re set=ha_innodb_plugin.so   SELECT  *  FROM  information_schema.INNODB_LOCKS;