技術向上

プログラミングの学び、気になるテクノロジーやビジネストレンドを発信

データベース

MySQLのインデックス

インデックスとは何か テーブルの中身を検索するときに、任意のカラムの値で検索しやすいようにしておくための機能です。 たとえばnameというカラムを持つメンバーリストのテーブルがあるとします。 それはid順では並んでいますが、name順では並んでいません…

SQLトランザクション【Go】

Goでのトランザクションの構築方法と、トランザクションの利用ケースについて触れます。 MySQLなどのデータベースにアクセスする際、Goではdatabaseパッケージを使うことができます。 databaseパッケージを用いてトランザクションを構築するには、Txを使いま…

ページング関連のクエリとUI設計【MySQL】

Limit Offsetは遅い MySQLを用いてページネーションを作成する際、はじめに遭遇するのが「Limit Offset」構文かもしれません。 MySQLに用意されている、ページングを実現するには便利な機能です。 SELECT * FROM tableA LIMIT 10 OFFSET 250 OFFSETに指定さ…

最後にInsertまたはUpdateしたレコードのIDを取得する【MySQL】

InsertまたはUpdateした後に、他の関連テーブルを操作するため、処理したレコードのIDを使いたい場合があるかと思います。そんな時は、LAST_INSERT_IDを利用します。 Upsert時に、UpdateしたレコードのIDを取得したい場合は、LAST_INSERT_IDを併せて更新する…

Upsert【MySQL】

なければInsertあればUpdateする、通称Upsert命令文です。Primary Keyの他、Unique Keyも考慮するので、事前にどのカラムにKeyを設定するか検討、対処しておく必要があります。 INSERT INTO stock( book_id, status, created_at, updated_at ) VALUES( 1, 1,…

SQLによる取得結果をHas Manyの形で格納する方法【Go】

SQLの取得結果をHas Manyの形で格納したいことがあるかもしれません。しかし、SQLでのSELECTの結果は階層化されていないので、ソースコードでロジックを組んで組み立てる必要があります。 Goの場合、SQLの取得結果を1行ずつ処理できるrow.Next()があるので、…

SQLのNULL値に対応する(JSON定義の変更まで)【Go】

SQLのSELECTの結果がNULLを返し、それを何らかのデータに格納する場合、格納先のデータの型を特別なものに指定する必要があります。 NULLを返すSQLを使用する場合、次のコードはエラーになります。 type someModel struct { code int name string } func mai…

データベースの監視

データベースを監視することで、障害の発生を回避したり、リスクを低減させるよう事前に策を打つことができるでしょう。 異常を知るためには、正常を知る・正常を定義する必要があります。 そのために「ベースライン情報」を収集します。UNIX系OSであれば、…

データベースの障害復旧の基礎

データベースの障害は、下記の状況で発生する可能性があります。 サーバー障害によるメモリ上のデータ損失 ネットワーク障害によるトランザクションの異常終了 ユーザーの誤操作によるデータ損失 自然災害などによる物理的破壊 データベースの障害が発生し、…

SQLのデータアクセス

OracleDBやMySQLなどのRDBMSは、どのようにデータにアクセス(SQLをどのように処理するか)するか、いくつか選択肢を持っています。 その中で代表的なのが「全表スキャン」と「索引スキャン」です。 全表スキャンは、SQLで指定された表のすべてのデータにア…

データベース構築とData Oriented Architecture

データベースの設計に焦点を当てます。 データベース構築 データベースを実際に作成してデータを投入する前に、データモデルを作成します。 データモデルの作成には、「ERモデル」を利用することが多いかもしれません。 ERモデルでは、「Entity(実体)」、…

RDBの構成要素

リレーショナルデータベース(RDB)は大きく次の3つから構成されます。 データベース プロセス 共有メモリ データベース データベースは、ディスク領域のOSファイルによって構成されています。 つまり、アクセスするたびにディスクI/Oによるコストがかかりま…

MySQL - invalid memory address or nil pointer dereference【Go】

複数の関数で、DBコネクションを使い回す場合には、注意が必要です。 dbだけでなく、sql.Open()の返り値に含まれるerrもpackageグローバルに定義して、 sql.Open()の返り値のアサインは「:=」ではなく、「=」を使用します。 var db *sql.DB var err error //…

MySQL【Go】

インストール sql-Driverごとにpackageをインストールする必要があります。 $ go get -u github.com/go-sql-driver/mysql import database/sqlは、コード中で使用するものの、mysqlについてはプログラムの起動処理には使われますが、コード中では使用しない…