2022-12

PostgreSQL

【PostgreSQL】UPSERT(ON CONFLICT)とRETURNINGで往復を減らす

こんにちは、かつコーチです。「レコードがあれば更新、なければ新規登録」という処理を書くとき、まずSELECTで存在チェックをしてからINSERTかUPDATEを分岐させていませんか。その方法はアプリケーションとDBの往復が増えるうえ、同時ア...
PostgreSQL

【PostgreSQL】ウィンドウ関数の基本:ランキングと集計を両立する

こんにちは、かつコーチです。「各カテゴリの売上ランキングを、元の行を保ったまま表示したい」と思ってGROUP BYを使ったら、個別の行が消えて集計値しか出せなかった、という経験はありませんか。そんなときに使うのがウィンドウ関数です。GROU...
PostgreSQL

【PostgreSQL】再帰CTEで階層データを扱う

こんにちは、かつコーチです。組織図、カテゴリのツリー構造、コメントの返信ネストなど、階層データはWebアプリの定番テーマです。前回はCTEの基本を扱いましたが、今回はCTE自身を参照して繰り返し処理を行う再帰CTEを掘り下げます。CTEの基...
PostgreSQL

【PostgreSQL】CTE(WITH句)の基本:クエリを読みやすく整理する

こんにちは、かつコーチです。サブクエリを何段もネストしたSQLを書いて、自分で見返したときに「これ何をやっているんだっけ」と迷った経験はありませんか。今回はそんなときに役立つCTE(Common Table Expression、共通テーブ...
PostgreSQL

【PostgreSQL】pgvectorでベクトル検索・類似検索を試す

こんにちは、かつコーチです。前回はJSONB型とGINインデックスで半構造化データを扱う方法を解説しました。今回は「データ型・JSON/pgvector」編の最終回として、pgvector拡張機能によるベクトル検索を扱います。上級者向けの内...
PostgreSQL

【PostgreSQL】JSONB型とGINインデックスで半構造化データを扱う

こんにちは、かつコーチです。前回は配列型・範囲型といったPostgreSQL固有のデータ型を紹介しました。今回はPostgreSQLの中でもとりわけ活用の幅が広いJSONB型と、それを高速に検索するためのGINインデックスを解説します。「柔...
PostgreSQL

【PostgreSQL】PostgreSQL固有のデータ型(配列型・範囲型など)

こんにちは、かつコーチです。前回まではPostgreSQLの環境構築を扱ってきました。ここからは「入門・環境構築」編を離れ、PostgreSQLならではのデータ型を扱う新しいカテゴリに入ります。MySQLしか触ったことがない人にとって、Po...
PostgreSQL

【PostgreSQL】psql・pgAdminの使い方の基本

こんにちは、かつコーチです。前回はPostgreSQLのインストールと初期設定を解説しました。今回はPostgreSQLを日常的に操作するための2つのツール、psql(コマンドラインクライアント)とpgAdmin(GUIクライアント)の基本...
PostgreSQL

【PostgreSQL】PostgreSQLのインストールと初期設定

こんにちは、かつコーチです。前回はPostgreSQLの特徴とMySQLとの違いを解説しました。今回は実際に手元の環境にPostgreSQL 16系をインストールし、最初に押さえておきたい初期設定まで解説します。環境構築でつまずくと学習のモ...
PostgreSQL

【PostgreSQL】PostgreSQLとは?拡張性の高いオープンソースRDBMSを初心者向けに解説

こんにちは、かつコーチです。SQL基礎編ではMySQLをベースに、SELECTやJOINといったSQLの基本文法を解説してきました。今回からは新シリーズとしてPostgreSQLを扱っていきます。「MySQLと何が違うの?」「なぜ最近Pos...
MySQL

【MySQL】MySQLとPostgreSQL、実務でどちらを選ぶべきか比較検証

こんにちは、かつコーチです。これでMySQL編は20本目、最終回です。「新しいプロジェクトのDB、MySQLとPostgreSQLどっちにしよう」これは、案件のDB選定のたびに必ず出てくる議論です。どちらも無料で使えるオープンソースのRDB...
MySQL

【MySQL】パーティショニングの基本:大規模テーブルを分割する

こんにちは、かつコーチです。数千万件規模のログテーブルに対して、直近1週間分のデータだけを集計するクエリを投げているのに、テーブル全体をスキャンしてしまい応答が返ってこない。インデックスを見直しても限界がある、そんな状況に心当たりはないでし...
MySQL

【MySQL】文字化けトラブルシューティング

こんにちは、かつコーチです。「絵文字を保存しようとしたらエラーになった」「日本語のデータが???や縺薙s縺ォ縺。縺ッのような文字化けで表示される」MySQLを触っていると、一度は文字コードのトラブルに遭遇するのではないでしょうか。文字コード...
MySQL

【MySQL】よくあるMySQLエラーまとめ(Access denied等)

こんにちは、かつコーチです。MySQLを触り始めると、必ずと言っていいほど遭遇するエラーがいくつかあります。「Access deniedって出たけどパスワードは合ってるはずなのに」「Can't connect to MySQL server...
MySQL

【MySQL】SQLインジェクション対策とプレースホルダの使い方

こんにちは、かつコーチです。「ログインフォームに' OR '1'='1と入力するだけで、誰でもログインできてしまう」こんな話を聞いたことはないでしょうか。これはSQLインジェクション(ユーザーの入力値をそのままSQL文に組み込むことで、意図...
MySQL

【MySQL】ユーザー権限管理:GRANT・REVOKEの基本

こんにちは、かつコーチです。「アプリのDB接続用ユーザーに、うっかりrootを使い続けていませんか」開発中はつい楽なのでrootユーザーで全部済ませてしまいがちですが、これは本番運用ではかなり危険な状態です。もしアプリにSQLインジェクショ...
MySQL

【MySQL】バイナリログの役割とポイントインタイムリカバリ

こんにちは、かつコーチです。前回はmysqldumpによるバックアップとリストアを解説しましたが、mysqldumpだけでは「昨晩0時時点」までしか戻せません。もし障害が発生したのが夜23時だった場合、直近23時間分のデータは失われてしまい...
MySQL

【MySQL】mysqldumpでバックアップ・リストアする方法

こんにちは、かつコーチです。前回はレプリケーションの仕組みを解説しましたが、レプリケーションはあくまで「複製」であり、誤ってデータを消してしまった場合には複製先にも同じ削除が伝わってしまいます。そのため、レプリケーションとは別にバックアップ...
MySQL

【MySQL】MySQLレプリケーションの基本:仕組みとメリット

こんにちは、かつコーチです。「インデックス・パフォーマンス編」が完結し、今回からは「レプリケーション・バックアップ編」です。1本目のテーマは、複数のMySQLサーバー間でデータを複製するレプリケーションの仕組みとメリットです。上級者向けの内...
MySQL

【MySQL】スロークエリログの見方と改善の第一歩

こんにちは、かつコーチです。前回はEXPLAINで個別クエリの実行計画を読む方法を解説しましたが、実務ではまず「どのクエリが遅いのか」を見つけるところから始まります。そこで活躍するのがスロークエリログです。今回は、スロークエリログの有効化か...