SQL

SQL

日本語の全文検索:MySQLのFULLTEXTとngramの使い方

MySQLで日本語の部分一致をLIKE '%語%'より速く探すために、ngramパーサーのFULLTEXTインデックスの作り方と検索の書き方を実例で解説します。BOOLEAN MODEを使う理由や、「京都」で「東京都」が出る落とし穴も扱います。
SQL

ALTER TABLEを止めずに行う:INSTANTとINPLACE

MySQL 8.0でALTER TABLEをサービスを止めずに行う方法を、ALGORITHM=INSTANT・INPLACE・COPYの違いから解説します。VARCHARの255バイトの境目やメタデータロック待ちの防ぎ方も、実行結果つきで紹介します。
SQL

MySQLでcreated_at・updated_atを自動で入れる

作成日時・更新日時をMySQLに自動で入れるDEFAULT CURRENT_TIMESTAMPとON UPDATEの書き方を、実行結果つきで解説します。値が同じだと更新日時が変わらない点など、MySQL 8.0で確かめた注意点も載せています。
SQL

MySQLの生成列と関数インデックスで式やJSONの検索を速くする

MySQLの生成列(VIRTUAL・STORED)と、8.0.13からの関数インデックスの作り方をEXPLAINの結果つきで解説します。JSONの値に貼るとき、照合順序が合わずにインデックスが使われない落とし穴も紹介します。
SQL

NOT NULL・UNIQUE・CHECK制約で不正データを防ぐ

MySQLのNOT NULL・UNIQUE・CHECK制約の書き方と、違反したときのエラーを実行結果つきで解説します。CHECKが効くのは8.0.16以降で、NULLは素通りする点にも触れます。初心者向け。
SQL

大量データのDELETE・UPDATEをLIMITで分割する方法

MySQLで数百万行のDELETEやUPDATEを1回で流すと、ロックやレプリカの遅れが起きます。LIMIT付きで少しずつ処理するループの書き方と、UPDATEが途中で止まる落とし穴を、実行結果つきで解説します。
SQL

カバリングインデックスで高速化:Using indexの意味と作り方

SELECTする列をすべてインデックスに含めて、テーブル本体を読まずに答えるカバリングインデックスの作り方を解説します。複合インデックスの列の順番や、SELECT *で効かなくなる理由もMySQL 8.0の実行結果つきで紹介します。
SQL

EXPLAIN ANALYZEの使い方:実行時間と実際の行数を読む

MySQL 8.0.18以降のEXPLAIN ANALYZEで、推定値ではなく実際の実行時間と行数を確かめる方法を解説します。actual timeやloopsの読み方、推定とのずれから遅い原因を探す手順まで、サンプルSQLつきで紹介します。
SQL

楽観ロックと悲観ロックの違い:FOR UPDATEとversion列

在庫の二重引き当てや更新の上書きを防ぐ排他制御を、MySQLのSELECT ... FOR UPDATEとversion列の2通りで実装します。NOWAIT・SKIP LOCKEDの使い方と、どちらを選ぶかの判断表つきです。
SQL

MySQLの照合順序とutf8mb4:検索結果が変わる理由と設定

MySQLで「はは」と「パパ」が一致したり、絵文字どうしが同じと判定されたりする原因を、照合順序(collation)の仕組みから解説します。主な照合順序の比較表と、DB・テーブル・列ごとの設定方法つき。