スキップしてメイン コンテンツに移動

投稿

MySQLのクエリチューニングの基本的な考え方

今回は、筆者が気をつけている、MySQLのクエリチューニングの基本的な考え方について、紹介しようと思います。 基本的な指針としては、下記を守ることが重要です。 MySQLがクエリの実行で使用する領域(≒メモリ使用量)を減らす。 クエリ対象の行を減らす (INDEX, サマリーテーブルを駆使)。 上記の基本的な指針に基づいて、クエリを組み立てる際は以下の点を考慮するとよいと思います。 SELECTで指定する行は少なくする。 JOINするテーブルの数は減らす。 TEXTや大きいサイズのVARACHARでのORDER BYは極力避ける。SUBSTRなどを使ってカラムの一部データのみを使うことも考慮。 EXPLAINを実行した際に Extra: Using where; Using temporary; Using filesort と表示される場合は要チェック。 確認部分: 巨大なTemporaryテーブルが作成されないように注意。 対策: 「ソート部分でINDEXを使えないか」「サマリーテーブルを使って余計なJOINを減らしソート対象の行数を減らせないか」を検討。 INDEXを効かせる。 テーブル設計段階でどのカラムにINDEXを張るかをしっかり検討 (当たり前ですが。) 特にソートの必要がある場合は、できるだけINDEXやPRIMARY KEYを利用できるようにクエリやテーブルを設計。 基本MySQLのクエリオプティマイザに従うべきですが、あえて特定のINDEXを効かせる/効かせない場合は FORCE INDEX STRAIGHT_JOIN の利用も検討。ただし、クエリの実行プランはデータによっても変わるので、基本、FORCE INDEXやSTRAIGHT_JOINは使うべきではないと筆者は考えています。 想定される状況が限定的 解決しようとしているクエリの問題が明確 性能改善度合いが大きい ときのみ、FORCE INDEXやSTRAIGHT_JOINは使用すべきかと思います。また強制したクエリの実行プランが最悪の実行プランになった場合も想定することをお勧めします。 複雑なネストクエリは避ける。 確認部分: Temporaryテーブル(INDEXが効かない!)が作成される可能性が高い上、メモリも大量に...

Java 8の機能利用に伴うSpring 4へのバージョンアップ

下記の順序で環境を更新していったときに、問題が起こったのでメモしておきます。 Spring 3 + Java 7: もともとの環境。 Spring 3 + Java 8 (Java 8のラムダ機能などのJava 8からの新機能は未使用): 問題なく動作。 Spring 3 + Java 8 (Java 8のラムダ機能などのJava 8からの新機能を使用): 起動時に下記のExceptionが発生 org.springframework.beans.factory.BeanDefinitionStoreException: Failed to read candidate component class: URL ...(途中省略)... java.lang.ArrayIndexOutOfBoundsException: xxx Googleで調べたところJava 8から導入された新機能を使う場合は、Spring 4に更新しないといけないようです。 Mavenとかは、使っていなかったので、Spring Frameworkから提供されているspring-xxx系のjarすべてをバージョン3.X系からバージョン4.X系のものに手動で置き換えました。 (Spring Frameworkはバージョン5.X系ももう出ているのですね。既に置いていかれているorz...) 無事にアプリケーションが起動するようになりました! ただ普通は、こんな乱暴にjarを入れ替えることは難しいので、アップデートはもっと慎重にやるべきでしょうね。

Google App Engineで外部のURLにアクセス

Google App Engine(GAE)から外部のネットワークへ接続する際の注意 Google App Engine(GAE)の開発環境の移行の際にJava 7からJava 8へ移行しました。 その際、GAEから、java.net.URL.openConnectionを使って普通に外部ネットワークのAPIを呼び出そうとすると下記のエラーが発生するようになってしまいました。 java.net.UnknownHostException: ホスト名 いろいろ調べていくと、下記のページにたどり着きました。 https://cloud.google.com/appengine/docs/standard/java/issue-requests 上記の表を間単に日本語訳すると URLのフェッチ方法 Java 7 Java 8 UrlFetch API Calls com.google.appengine.urlfetch.*以下のクラスを使う。無料で使用できる部分あり。 com.google.appengine.urlfetch.*以下のクラスを使う。無料で使用できる部分あり。 Javaネイティブのjava.net.URL.openConnectionなどを使う方法 無料ユーザも制限なく利用可能。 無料ユーザは、利用不可。 java.net.UnknownHostException、java.net.SocketTimeoutException、java.io.IOException とかが投げられる。 まとめると、 GAEで外部ネットワークへアクセスする方法には「GAEが提供するUrlFetch API Calls」「Javaネイティブのjava.net.URL.openConnection」の2つ方法がある。 Java 7では、「GAEが提供するUrlFetch API Calls」「Javaネイティブのjava.net.URL.openConnection」は無料でどちらの方法も利用可能。 Java 8で無料で利用できるのは「GAEが提供するUrlFetch API Calls」のみ。 Java 8で「Javaネイティブのjava.net.URL.openConnectionの方法」は課金ユーザーのみ利...

Goolge App Engineの開発環境の更新 (Java)

Google Plugins for EclipseからCloud Tools for Eclipseの移行 長らくEclipse Luna (4.4) + Google Plugin for Eclipseで開発を続けてきたのですが、Google App Engineの開発ページを覗いたら下記のようなメッセージが出ていてびっくり。 The Google Plugin for Eclipse is deprecated and will be removed in January 2018. Migrate to Cloud Tools for Eclipse and/or the GWT Eclipse Plugin as soon as possible to avoid disruption. Google Plugin for Eclipseは、2018年の1月でサポート打ち切りで、Cloud Tools for Eclipseに移行しなさいとのこと。 せっかくなので最新のeclipseを使って下記の設定で開発環境を再構築することにしました。 移行方法 最新のJDK 8 を http://www.oracle.com/technetwork/java/javase/downloads/index.html からダウンロードしてインストール。JDKをダウンロード Java 9 も試そうかとも思ったのですが、2017年9月現在Google App Engine側はまだJava 8までしかサポートしていないので、 Eclipseを  http://www.eclipse.org/downloads/eclipse-packages/  からダウンロード。私は、Eclipse IDE for Java Developersをダウンロードしました。 EclipseでGoogle App Engineの開発を行うための設定を https://cloud.google.com/eclipse/docs/quickstart  を読んで実施。 Google Cloud SDKをダウンロード Google Cloud Tools for Eclipse をEclipse Marketplace.を通してインス...

「プログラミングの心理学 25周年記念版」(ジェラルド・M・ワインバーグ 著)

ジェラルド・M・ワインバーグは、自身のコンピューター業界を中心としたコンサルタント業の経験をもとに、人間やシステムの性質を本質的に捉えた数多くの書籍を発表しています。 今回紹介するのは、その中の「 プログラミングの心理学 25周年記念版 」になります。 25周年は、英語ではSilver anniversaryと表現されるようで、原題は「 The Psychology of Computer Programming: Silver Anniversary Edition 」となっています。 本書題名中の25周年というのは、原著の「The Psychology of Computer Programming」の初版が発行された1971年から25年後、つまり1998年に発行された英語版のことをさして、25周年といっています。この英語版の「 The Psychology of Computer Programming: Silver Anniversary Edition 」は、一度2005年に邦訳されて2005年に「 プログラミングの心理学―または、ハイテクノロジーの人間学 25周年記念版 」として刊行されています。今回紹介するのは、2005年に刊行された邦訳版の装丁を変えて2011年に再発刊されたものになります。ですので、おおもとの原著からは、40年経っていることになります。 本書では、1971年当時の初版の構成をそのままに、そのあとに25年後のワインバーグの振り返りが追記されるという形式をとっています。 この書評を書いている時点で、40年以上も前 (25周年を記念して加筆された部分は20年前)の内容で役に立つのと思う方も多いと思いますが、それがどうして、世の中あまり変わっていないのか、今でも十分に通用する示唆に富んだエピソードが多く紹介されています。 とはいえ12章「プログラミング言語の設計原則」で出てくる言語の話題はCOBOLとかFORTRANなので、「その言語なに?おいしいの?」「古臭い話だ!」と思う人が多いと思います。それでもよく掘り下げて読んでみると、普遍的な話題を扱っていることに気づかされると思います。これは、本書が「心理学」という言葉を使っているとおり、いつまでたっても変わらない、人間の根本的な性質を軸に書かれているからだと思い...

「世界一わかりやすいプロジェクトマネジメント 第4版」(G・マイケル・キャンベル著)

今回紹介するのは、「 世界一わかりやすいプロジェクトマネジメント 第4版 」です。 本書は「IDIOT'S GUIDE」シリーズの中の一冊になります。 英語の最新版は2014年刊行の第6版「 Project Management, Sixth Edition (Idiot's Guides)  」のようです。   本書では、プロジェクトマネジメントにかかわる基礎的な手法や用語が細かく解説されています。たとえば、 PDCAサイクル ガント・チャート (gantt chart) クリティカル・パス (critical path) WBS (Work Breakdown Structure) 振り返り スコープ・クリープ (scope creep) などです。本書は邦訳された書籍なので、日本語のプロジェクトマネジメント用語が英語ではどういうものになるのかも参考になると思います。 個人的には解説の途中途中で、数行さしこまれている「ときは金なり」「現場の声」「ご用心」「賢者の言葉」の項が読んでいて、面白かったです。 本書は、教科書的な書き方で書かれているので、面白みはないですが、プロジェクトマネジメントで発生する作業について網羅的に書かれているので、プロジェクトマネジメントに初めて取り組む人にとっては、よいスタート地点になると思います。より実践的なものを求める方は、「 アート・オブ・プロジェクトマネジメント ―マイクロソフトで培われた実践手法 」の方がお勧めです。

「チームが機能するとはどういうことか―「学習力」と「実行力」を高める実践アプローチ」(エイミー・C・エドモンドソン著)

今日紹介する書籍は、「 チームが機能するとはどういうことか―「学習力」と「実行力」を高める実践アプローチ 」です。 本書はタイトルどおり、チーミングでも特に「学習」という部分に特に重点を置いて書かれています。 原著は「 Teaming: How Organizations Learn, Innovate, and Compete in the Knowledge Economy 」になります。直訳すると「チーミング: 知識経済の中で、いかにして組織は学習し、イノベーティブになり、競争するか」にでもなるでしょうか。 この書籍については直訳より、邦訳版の題名の方が断然よいと思います。私が本書の内容を読んだ限りでも、邦訳版の題名は、本書の内容をよく表していると思います。 予断ですが、Innovationの訳は日本語では、カタカナ英語のイノベーションが一般的になっているとは思いますが、何かもっとピッタリ来る日本語はないのでしょうか。 本書はリーダーがトップダウンの決定を下すのではなく、チームメンバーそれぞれが自身の専門性や得意分野を生かし、意見の対立を乗り越えて、チーム全体で学習しながらチーム全体のパフォーマンスを上げるためには、どうすればよいかについて実例を交えながら詳細に述べられています。 こういったチーミングやマネジメントの話は、掘り下げていくと、人間の内面に深く根ざした部分にたどり着き心理学の研究結果が大いに役に立つものですが、本書もその例に漏れず、心理学分野の研究結果も交えなながら、効果的なチーミング手法について解説がなされています。例えば、人間は今まで自分が経験してきたものによって、現在の状況の認識が左右されているという観点(=フレーミング)から、革新的なプロジェクトを成功させるためには、どのような「フレーミング」が適切かを解き明かし、またリーダーはどのようにしてチームに適切なフレームを導入することができるかについて解説しています。 多くの書籍で「失敗」から学ぶことの重要性について語られていますが、本書では「失敗」を罰せられない環境づくりがなければ、「失敗」から学ぶことは難しいと指摘しています。本書では、失敗を「防ぐことのできる失敗」「複雑な失敗」「知的な失敗」に分類し、「防ぐことのできる失敗」は根本原因の究明を行い、「複雑な...