Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
インデックス使えてる?じぇじぇじぇ!
Search
matsuu
July 28, 2013
Technology
0
1.6k
インデックス使えてる?じぇじぇじぇ!
qpstudyのLT発表資料です。懇親会がお通夜状態になったでござる。すみません。
matsuu
July 28, 2013
Tweet
Share
More Decks by matsuu
See All by matsuu
ISUCON名誉運営の話
matsuu
1
440
Other Decks in Technology
See All in Technology
10年もののバグを退治した話
n_seki
0
150
完全自律型AIエージェントとAgentic Workflow〜ワークフロー構築という現実解
pharma_x_tech
0
240
Git scrapingで始める継続的なデータ追跡 / Git Scraping
ohbarye
4
110
WantedlyでのKotlin Multiplatformの導入と課題 / Kotlin Multiplatform Implementation and Challenges at Wantedly
kubode
0
200
プロダクト組織で取り組むアドベントカレンダー/Advent Calendar in Product Teams
mixplace
0
680
.NET 最新アップデート ~ AI とクラウド時代のアプリモダナイゼーション
chack411
0
170
Copilotの力を実感!3ヶ月間の生成AI研修の試行錯誤&成功事例をご紹介。果たして得たものとは・・?
ktc_shiori
0
280
信頼されるためにやったこと、 やらなかったこと。/What we did to be trusted, What we did not do.
bitkey
PRO
0
1.9k
AWSの生成AIサービス Amazon Bedrock入門!(2025年1月版)
minorun365
PRO
7
420
LangGraphとFlaskを用いた社内資料検索ボットの実装②Retriever構築編
aoikumadaki
0
100
OPENLOGI Company Profile
hr01
0
58k
【令和最新版】ロボットシミュレータ Genesis x ROS 2で始める快適AIロボット開発
hakuturu583
2
1.5k
Featured
See All Featured
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
10
860
Facilitating Awesome Meetings
lara
50
6.2k
Building Your Own Lightsaber
phodgson
104
6.2k
Building a Modern Day E-commerce SEO Strategy
aleyda
38
7k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
230
52k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
47
5.1k
Mobile First: as difficult as doing things right
swwweet
222
9k
Building Applications with DynamoDB
mza
92
6.2k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
98
18k
We Have a Design System, Now What?
morganepeng
51
7.3k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
226
22k
Reflections from 52 weeks, 52 projects
jeffersonlam
348
20k
Transcript
matsuu / qpstudy 20130728 インデックス使えてる? じぇじぇじぇ!
• まつうです ◦ hatena tmatsuu ◦ twitter matsuu ◦ 32歳ぐらい
• インフラエンジニアだけど元プログラマ ◦ SQL好きです ◦ PostgreSQL派(だけど仕事はMySQLをよく使う) ◦ 仕事でチューニングやることもある • 今日は懇親会のみ参加です ◦ 勉強会の内容とかぶってたらごめんなさい • じぇじぇとか言ってるけど朝ドラ見てない ◦ じぇじぇはNHKの朝ドラ「あまちゃん」のネタです 自己紹介?じぇじぇ!
突然ですが…
クイズです
じぇじぇじぇ!
クイズの内容 • インデックスに関するクイズを3問だすよ ◦ 特に景品などは用意してません ◦ MySQLとPostgreSQLを想定しています • 人の褌で相撲を取ってるよ ◦
元ネタは http://use-the-index-luke.com/3-minute-test • 社内勉強会の使い回しネタだよ ◦ じぇじぇじぇ!すみません • 間違い等あれば適宜指摘して下さい ◦ じぇじぇじぇ!ごめんなさい
インデックスとは(Wikipedia引用) http://ja.wikipedia.org/wiki/%E7%B4%A2%E5%BC%95_(%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82% B9) データベースの分野において、索引(さくいん)またはインデック ス (英: index) は、表への処理を高速化するためのデータ構 造。索引は表の中の1個以上の列を対象に作成され、ランダム な参照処理や一定の順序でのレコードへのアクセスの効率を
高めることができる。
ざっくりとしたインデックス作成方法 CREATE INDEX インデックス名 ON テーブル名(カラム,...); (例) 2013年7月28日に作成された記事一覧を取得する SELECT *
FROM 記事 WHERE 作成日 = '2013-07-28'; →作成日にインデックスを張る CREATE INDEX 作成日idx ON 記事 (作成日);
クイズ その1 2012年に作成された記事一覧を取得したい SELECT * FROM 記事 WHERE year(作成日) =
2012; 次のようなインデックスを作ると効果があるか? CREATE INDEX i1 ON 記事 (作成日); • 速くなる • 速くなるが、もっと良い方法がある • 速くならない ※PostgreSQLの場合はyear(作成日)→date_part('year', 作成日)
クイズ その1こたえ 2012年に作成された記事一覧を取得したい SELECT * FROM 記事 WHERE year(作成日) =
2012; 次のようなインデックスを作ると効果があるか? CREATE INDEX i1 ON 記事 (作成日); ×速くなる ×速くなるが、もっと良い方法がある ◦速くならない じぇじぇじぇ! 作成日にインデックスが張られていても、YEAR(作成日)にインデックスは使われな い。
クイズ その1対策 • 関数にインデックスを張る CREATE INDEX i2 ON 記事 (YEAR(作成日));
→MySQLではできません • BETWEENを使う SELECT タイトル FROM 記事 WHERE 作成日 BETWEEN '2012-01-01' AND '2012-12-31'; • 作成年を用意する ALTER TABLE 記事 ADD COLUMN 作成年 INTEGER; CREATE INDEX i3 ON 記事 (作成年); →記事を新規作成・更新した際に作成年のケアが必要 →冗長で美しくないけどね
クイズ その2 カテゴリが「仕事」の最新の記事を1件取得したい SELECT * FROM 記事 WHERE カテゴリ =
'仕事' ORDER BY 作成日 DESC LIMIT 1; 次のようなインデックスを作ると効果があるか? CREATE INDEX i4 ON 記事 (カテゴリ, 作成日); • 速くなる • 速くなるが、もっと良い方法がある • 速くならない
クイズ その2こたえ カテゴリが「仕事」の最新の記事を1件取得したい SELECT * FROM 記事 WHERE カテゴリ =
'仕事' ORDER BY 作成日 DESC LIMIT 1; 次のようなインデックスを作ると効果があるか? CREATE INDEX i4 ON 記事 (カテゴリ, 作成日); ◦速くなる ×速くなるが、もっと良い方法がある ×速くならない じぇじぇじぇ!
クイズ その2補足 CREATE INDEXのカラムにはカラムを逆順に並べるオプション DESCが存在する CREATE INDEX i4 ON 記事
(カテゴリ, 作成日 DESC); がしかし、今回のようなSQLであれば、DESCをつけてもつけな くても応答時間は変わらない ORDER BYにカラムが複数あり、ソート順が異なるのであれば 効果あり (例)ORDER BY 優先度 DESC, 作成日 ※ちなみにMySQLではDESCをつけても無視されれ常にASC(MySQL 5.6現在)
クイズ その3 カテゴリと投稿者で記事を絞り込みたい 1. SELECT * FROM 記事 WHERE 投稿者
= 'iara' AND カテゴリ = '勉強会'; 2. SELECT * FROM 記事 WHERE 投稿者 = 'matsuu'; 3. SELECT * FROM 記事 WHERE カテゴリ = 'エンタメ'; 次のようなインデックスを作ると効果があるか? CREATE INDEX i5 ON 記事 (カテゴリ, 投稿者); • 1は速くなる?変わらない? • 2は速くなる?変わらない? • 3は速くなる?変わらない?
クイズ その3こたえ カテゴリと投稿者で記事を絞り込みたい 1. SELECT * FROM 記事 WHERE 投稿者
= 'iara' AND カテゴリ = '勉強会'; 2. SELECT * FROM 記事 WHERE 投稿者 = 'matsuu'; 3. SELECT * FROM 記事 WHERE カテゴリ = 'エンタメ'; 次のようなインデックスを作ると効果があるか? CREATE INDEX i5 ON 記事 (カテゴリ, 投稿者); • 1は速くなる • 2は変わらない • 3は速くなる じぇじぇじぇ!
クイズ その3補足 CREATE INDEX i5 ON 記事 (カテゴリ, 投稿者); インデックスのカラムの順番には意味がある
• 検索条件がカテゴリ→OK • 検索条件がカテゴリと投稿者→OK • 検索条件が投稿者→NG • 検索条件がカテゴリとタイトル→カテゴリだけOK 投稿者のみの検索も行うなら以下も追加するのもアリかと CREATE INDEX i6 ON 記事 (投稿者); インデックスマージってのも一応あるよ
いかがでしたか クイズ終了
まとめ • SELECTが遅いようであればインデックスを 張ってみよう ◦ 効果があるかきちんと確認すべし ◦ 張りすぎはINSERT等が重くなるので注意 • まず検証環境を用意しましょう
◦ 応答が遅くなったりするので影響がないように ◦ データの内容や行数によっても変化するので本番とほ ぼ同じデータを用意するのがいいよ • 詳しくはUse The Index, Luke!を参照 ◦ http://use-the-index-luke.com/ ◦ 日本語の資料でいいのあれば教えてほしい
ご清聴 ありがとうございました