MySQL と PostgreSQL の比較
データの保存
列とスキーマの決定は、データが本番に入った後では元に戻しにくいものです。これらのガイドは、列の型、主キー戦略、制約、そして VillageSQL の拡張機能フレームワークが可能にする型 — ネイティブの UUID やネットワークアドレス型など — を扱います。- UUID を効率的に生成して保存する方法
- 自動増分、UUID、複合キーの中から選ぶ方法
- IPv4 と IPv6 のアドレスを効率的に保存する方法
- MySQL で MAC アドレスを保存してクエリする方法
- VillageSQL で IPv6 アドレスをネイティブに扱う方法
- JSON ドキュメントを保存、クエリ、操作する方法
- データに合った列の型を選ぶ方法
- TINYINT(1) の代わりに本物のブール値を保存する方法
- 文字セットと照合順序がデータにどう影響するか
- MySQL のタイムスタンプでタイムゾーンを正しく扱う方法
- データベースの正規化でスキーマを構成する方法
- 外部キーで参照整合性を強制する方法
- 生成列で派生値を計算してインデックスを付ける方法
- CHECK 制約でデータベースレベルでデータを検証する方法
- deleted_at 列でソフトデリートを実装する方法
- utf8mb4 で絵文字と完全な Unicode を保存する方法
クエリの作成
これらのガイドは、JOIN と集計からウィンドウ関数、CTE、全文検索まで、最もよく書く SQL を扱います。VillageSQL 固有のガイドには、IP サブネットによるクエリや、HTTP と AI の関数による結果の拡充が含まれます。- 遅い、または誤った JOIN を正しく動かす方法
- サブクエリと JOIN のどちらにするか決める方法
- CTE が役立っているか害になっているかを見分ける方法
- 遅い GROUP BY を速くする方法
- ウィンドウ関数で累計、順位、移動平均を計算する方法
- MySQL で NULL がどう振る舞い、どう正しく扱うか
- MySQL で全文検索を実装する方法
- ビューで複雑なクエリを単純にする方法
- upsert で 1 つのステートメントで行を挿入または更新する方法
- キーセットと OFFSET のページネーションで大きな結果セットをページ分けする方法
- SQL で文字列を操作および変換する方法
- MySQL のクエリで日付と時刻を扱う方法
- MySQL で IP サブネットによるクエリと絞り込みを行う方法
- MySQL で IP アドレスによる位置情報の検索を行う方法
- MySQL から直接 HTTP リクエストを送る方法
- 外部の REST API のデータでクエリ結果を拡充する方法
- cube 型で多次元データを保存してクエリする方法
- MySQL でトライグラム類似度を使って似た文字列を見つける方法
- MySQL で名前を音声的に、また編集距離で一致させる方法
データの保護
VillageSQL の crypto 拡張機能は、bcrypt、AES 暗号化、HMAC 署名、ダイジェスト関数を SQL に持ち込みます。これらのガイドは、それらの暗号関数を、MySQL 組み込みのユーザーと権限の管理と合わせて扱います。- bcrypt と Argon2 でパスワードを安全にハッシュ化する方法
- データの整合性のためにチェックサムとダイジェストを生成する方法
- 機密性の高い列のデータをデータベースレベルで暗号化する方法
- MySQL で AES を使ってデータを暗号化および復号する方法
- MySQL で HMAC を使ってデータに署名し検証する方法
- 暗号学的に安全なランダム値を生成する方法
- MySQL のユーザーと権限を作成して管理する方法
- ユーザーがパスワードの代わりに JWT でサインインできるようにする方法
- 本番向けに MySQL サーバーのセキュリティを強化する方法
パフォーマンスの最適化
遅いクエリは、たいていインデックスかスキーマの問題です。これらのガイドは、EXPLAIN の出力、スロークエリログ、InnoDB がデータを保存する仕組みの理解を使って、それらを診断する方法と、何を変えるべきかを扱います。- 遅い MySQL クエリを診断して修正する方法
- インデックスの仕組みと使うべき場面
- MySQL の EXPLAIN 出力を読んで対処する方法
- カバリングインデックスがテーブルルックアップをなくす仕組み
- スロークエリログで遅いクエリを見つけて修正する方法
- コネクションプーリングでデータベース接続を効率的に管理する方法
- InnoDB がデータを保存する仕組みと、それがパフォーマンスに重要な理由
- 大量のデータを高速に挿入する方法
- クエリパフォーマンス向上のために大きなテーブルをパーティション分割する方法
AI で構築する
VillageSQL の AI 拡張機能を使うと、言語モデルの呼び出しと埋め込みの生成を SQL から直接行えます。これらのガイドは、プロバイダーのセットアップと、実際のクエリでai_prompt() と ai_embedding() を使う方法を扱います。
- VillageSQL の AI プロバイダーの認証情報を設定する方法
- ai_prompt() で SQL から直接 AI モデルを呼び出す方法
- MySQL でベクトル埋め込みを生成して保存する方法
- MySQL の中から AI を使ってテキストを分類する方法
- MySQL で AI 関数を使ってセンチメント分析を行う方法
- SQL の中で AI を使ってテキストを直接要約する方法
- MCP で AI エージェントを MySQL に接続する方法
MySQL の運用
これらのガイドは運用面を扱います。スキーマ移行、Docker のセットアップ、トランザクション、レプリケーション、バックアップ、そして本番で問題が起きたときにすべきことです。- 最小限のダウンタイムで MySQL をアップグレードする方法
- サポート終了後に MySQL 8.0 から 8.4 にアップグレードする方法
- PostgreSQL から MySQL に移行する方法
- MariaDB から MySQL に移行する方法
- 本番でスキーマの変更を安全に管理する方法
- 稼働中のテーブルにダウンタイムなしで ALTER TABLE を実行する方法
- MySQL 向けに Django、Rails、Prisma を設定する方法
- ローカル開発と本番のために Docker で MySQL を実行する方法
- Testcontainers で実際の MySQL サーバーに対してテストする方法
- Kubernetes 上で MySQL を実行する方法
- トランザクションを使ってデータの一貫性を保つ方法
- デッドロックを検出、防止し、そこから回復する方法
- 最もよくある MySQL のエラーを修正する方法
- MySQL でストアドプロシージャを作成して使う方法
- MySQL のトリガーで操作を自動化する方法
- MySQL のトリガーから Webhook を送信する方法
- INFORMATION_SCHEMA で MySQL のメタデータをクエリする方法
- MySQL データベースをバックアップして復元する方法
- MySQL レプリケーションの仕組みとセットアップ方法
- MySQL のリードレプリカで読み取りをスケールする方法
- バイナリログの仕組みと、ポイントインタイムリカバリに使う方法
アプリケーションの接続
フレームワークごとに MySQL への接続の仕方は少しずつ違います。これらのガイドはそれぞれ、稼働中のサーバーに対して小さな動作するアプリケーションを構築し、初回に間違えやすいセットアップの手順 — ドライバーの選択、マイグレーション、コネクションプーリング、そしてプールをどこに置くべきか — を扱います。- Prisma で Next.js を MySQL に接続する方法
- Drizzle で Next.js を MySQL に接続する方法
- ORM なしで Next.js を MySQL に接続する方法
- SQLAlchemy 2.0 で FastAPI を MySQL に接続する方法
- Eloquent で Laravel を MySQL に接続する方法
- ActiveRecord で Rails を MySQL に接続する方法
- sqlc で Go の型安全な MySQL クエリを生成する方法
- サーバーレスランタイムが MySQL の接続を使い果たさないようにする方法
- MySQL のテーブルを REST API として公開する方法