タグ

DBに関するdorapon2000のブックマーク (14)

  • MySQLで「無ければINSERT、あればUPDATE」を実現する方法 - Mobile Factory Tech Blog

    こんにちは、駅奪取エンジニアの id:kimkim0106(旧: id:kaoru_k_0106)です。 今回の記事は、駅奪取でテーブルにレコードが「無ければ INSERT、あれば UPDATE」(いわゆる UPSERT)をする箇所で Duplicate entry が出ていたのを修正したり、未然に防ぐ実装をしたときに得られた知見です。 このような処理はよく使われますが、うまく実装しないとエラーが発生したりパフォーマンスの問題が生じたりします。 この記事では、自分が試した方法のメリット・デメリットについて説明します。 目次 前提条件 Duplicate entry とは 1. Duplicate entry が出たらトランザクション自体をやり直す 2. INSERT ... ON DUPLICATE KEY UPDATE 3. とりあえず INSERT して Duplicate entry

    MySQLで「無ければINSERT、あればUPDATE」を実現する方法 - Mobile Factory Tech Blog
    dorapon2000
    dorapon2000 2024/06/12
    “これは、どのようなレコードが INSERT されるか前もってわかるのであれば、先に INSERT しておくことで同時に INSERT されずに済むという解決策です。”
  • サブクエリの書き方を2万文字弱かけてすべて解説する

    これはなに ども、レバテック開発部のもりたです。 今回はSQLのサブクエリについてまとめます。仕事でクエリを書く際、サブクエリは頻出の構文だと思うんですが、同時にサブクエリの書き方を完全に理解しているよという人は案外少ないのではないでしょうか?[1] 実際、MySQLの公式ドキュメントを見ると12ページくらいを割かれており、意外と奥深いのがサブクエリです。使いこなせると便利ですし、何よりちょっとSQLのコツみたいなのがわかって面白いよ、ということで記事にしてみました。 前提 この記事は以下の前提を含んでいます。 環境 MySQL8.0系 読者の知識 なんとなくサブクエリが書ける けど相関サブクエリとかになると「あーっ」つってGoogle meetを閉じてしまうくらいのレベル感 記事のボリューム 18,000文字 おれの卒論が20,000文字だった マサカリ 間違ってたら投げてくれ〜〜 それ

    サブクエリの書き方を2万文字弱かけてすべて解説する
  • 今更聞けないDBMSのメモリ管理について

    DBMSのメモリ管理について データベース管理システム(DBMS)の設計では、大量のデータと複雑なクエリを処理するために、ハードウェアの特性を最大限引き出すことが求められます。 この記事では、DBMSがどのようにメモリを使ってデータアクセスの速度を向上させ、同時にデータの安全性を確保しているのかを解説します。 DBMSと記憶装置の関係について DBMSが使う記憶装置は次の2つです。 HDD HDDは磁気ディスクを使用してデータを記録・読み取りする記憶装置です。その主な特徴は大容量であり、コスト効率が良いことです。DBMSでは、データの永続的な保存にHDDが用いられます。これにより、システムがシャットダウンされた後もデータが保持され、必要に応じて再びアクセス可能となります。 しかし、HDDのデータアクセス速度はメモリに比べて遅いため、リアルタイム処理や高速なトランザクションが求められるアプリ

    今更聞けないDBMSのメモリ管理について
    dorapon2000
    dorapon2000 2024/04/30
    “しかし、大量の更新を行うシステムでは、ログバッファのサイズを増やす調整が必要になります。ここには検索と更新をどちらを優先するかのトレードオフが存在します。”
  • データベースに接続するテストの仕組みを整備した話 - Qiita

    はじめに かれこれ1年以上前のことになりますが、今の開発組織でデータベースに接続するJunitを使ったIntegrationTest1 を開発者のPCとCIで実行できる仕組みを作りました。 トライしたきっかけと想い 仕組みの設計・導入をする時に気を付けたこと 具体的な実現方法 トライしてみて感じたこと を記載します。 トライしたきっかけと想い 私が保守開発を担当しているプロダクトは20年近く運用されているWebアプリケーションです。(サーバーサイドはJava) 単体テストの仕組みと文化が無いまま長期間運用されており、大半のコードがレガシーコードという状態でした。 一部テストが書かれている箇所もありましたが、CIでの実行の仕組みはなく腐ってしまっているものも多い状態でした。 そこに @autotaker1984 さんがCIでの単体テスト実行の仕組みを作ってくれて、単体テストを書くべきというマ

    データベースに接続するテストの仕組みを整備した話 - Qiita
    dorapon2000
    dorapon2000 2024/04/04
    “上記のような違いがあるため、データベースに接続しないテストとするテストは区別できるような仕組みにしました。”
  • Time-based SQL Injectionは意外に実用的だった

    このエントリでは、Time-based SQLインジェクション、すなわち時間差を利用したSQLインジェクションが意外に実用的だったという報告をします。デモ映像ありです。 はじめに Time-based SQL Injectionという攻撃があります。これはブラインドSQLインジェクションの一種で、ある条件の場合に一定時間(例えば5秒)スリープし、そうでない時との応答時間の差で情報を盗もうというものです。1回のHTTPリクエストで1ビットの情報が得られるので、それを積み重ねることによって、いくらでも情報を盗めるはずです…理論的には。 しかし、「理屈はそうでも、時間が掛かりすぎるよね」ということで、深くは追っかけていませんでした。SQLインジェクションの検査には有効でも、悪用としての実用性はあまりないと考えていたのです。 きっかけ きっかけは、以下のYahoo!知恵袋に以下の質問です。 SQL

    Time-based SQL Injectionは意外に実用的だった
    dorapon2000
    dorapon2000 2024/03/25
    “このエントリでは、Time-based SQLインジェクション、すなわち時間差を利用したSQLインジェクションが意外に実用的だったという報告をします”
  • MySQL(InnoDB)のSQLパフォーマンスチューニングのエッセンス

    はじめに MySQL(InnoDB)でSQLのパフォーマンスチューニングをするときに役に立つ知識をエッセンスとしてまとめました。結合(JOIN)やB-treeインデックスの探索の仕組み、実行計画の基的な見方を紹介します。 想定する読者は、SQLのパフォーマンスを改善する必要があるが実行計画をみてもいまいちピンと来ない方です。インデックスの作成の経験や、複合インデックスやカーディナリティの知識があることを前提にしています。目標は、実行計画の内容がよく分からない読者が、実行計画をみただけでクエリが実行される様子をイメージでき、自信を持ってクエリの改善にあたることができるようにすることです。 ストレージエンジンはInnoDBを前提としています。また、インデックスはB-treeインデックスを想定しています。全文検索の転置インデックスや空間検索のR-treeインデックスについては触れません。 イン

    MySQL(InnoDB)のSQLパフォーマンスチューニングのエッセンス
  • 履歴データテーブルとの向き合い方_PHPerKaigi2024

    PHPerKaigi2024 の登壇資料です。 履歴データテーブルとの向き合い方 https://fortee.jp/phperkaigi-2024/proposal/47cf9f17-825a-4021-bf33-86e4a62bc222

    履歴データテーブルとの向き合い方_PHPerKaigi2024
    dorapon2000
    dorapon2000 2024/03/09
    言われるとそうだけど自分では気付けない。目からウロコ。
  • DDDとORMのEntityを混同しないための考え方

    2つの ”Entity” ある種の ORM では RDB のテーブルスキーマモデルとなるクラスのことをEntityと呼んでいます。例えば PHP のDoctrineや TypeScript のTypeORMなどがそうです。 そういった ORM を採用したプロジェクトで DDD に取り組むとき困るのが用語の衝突です。ORM の Entity は RDB のための定義を含むため当然 DDD の Entity とは異なるのですが、なにぶん同じ名前なので混同してしまいがちです。 記事では両者を混同せず扱うための考え方をまとめます。 Entity の定義 まずは定義から確認します。 DDD での定義 エヴァンスの日語訳から引用します。 主として同一性によって定義されるオブジェクトはエンティティと呼ばれる Eric Evans. エリック・エヴァンスのドメイン駆動設計 (Japanese Edi

    DDDとORMのEntityを混同しないための考え方
    dorapon2000
    dorapon2000 2024/02/24
    “個人的に検討中なのですが、集約の手法をつかい ORMEntity の CRUD が集約ルートを介してのみ行われるようにするのが重要だと考えています。”
  • 毎日本番DBをダンプして、ローカルと開発環境で利用して生産性を上げてる話

    シードデータで動作確認して大丈夫だったのに、番反映してみたら想定してなかった挙動・エラーが出た😱そんな経験はありませんか。 恥ずかしながら私は今までに何回もありました。機能開発だけじゃなくバッチやマイグレーションなんかでも発生しがちなコレ。またはシードデータで動作確認できても、番データでも通用するか検証ができないままプルリクを作る、なんていうこともあると思います。今回はこちらを無くす試みをしたお話です。 「もうDBで開発しちゃえばいいじゃない」の問題点 この課題を解決するには、極論するとDBで開発するしかないのですが、そうなると言うまでもなく以下の問題が出てきます。 レビュー通過してないコードが番に影響を与える トライ&エラーができない 個人情報をはじめとするセンシティブな情報が開発者の端末に漏れる データ量が多すぎてローカルに持ってこれない しかし言い換えると、これらをク

    毎日本番DBをダンプして、ローカルと開発環境で利用して生産性を上げてる話
    dorapon2000
    dorapon2000 2024/02/21
    “Amazon Aurora(Mysql)を使っており、本番DBを毎朝ポイントインタイムリカバリしてクローンしています。つまりこの時点では本番と開発環境と本番をクローンした3つのDBクラスターが存在しています。”
  • コスト削減のため Redis の sorted sets で実装していたランキング処理を MySQL に移行しました - Mobile Factory Tech Blog

    駅メモ!チームエンジニアの id:yumlonne です。 この記事では Redis の sorted sets で実装していたランキング処理を MySQL に移行した仕組みを紹介します。 背景 駅メモ!には複数のランキングがあり、Redis の sorted sets を使うことでパフォーマンスの高いランキング処理を実現していました。 中にはリリースからの全期間に渡るデータを利用するランキングもあり、Redis のメモリ使用率は日に日に増えていく一方でした。 何度か Redis をスケールアップしてメモリを増やすことで対応していましたが、根的に対応しなければ今後も Redis をスケールアップもしくはスケールアウトさせ続けるしか選択肢がなく、コストが増え続けてしまう状況でした。 調査したところ、一部のランキングがメモリ使用率の 2/3 程度を占めていることが判明しました。 そこで、その

    コスト削減のため Redis の sorted sets で実装していたランキング処理を MySQL に移行しました - Mobile Factory Tech Blog
    dorapon2000
    dorapon2000 2024/01/30
    “順位を +1 するのがポイントです。 スコアは更新しないので他のトランザクションの更新対象に影響を与えず、順位は 順位 = 順位 + 1 のようにすれば更新前の状態でロックを取っておく必要はありません。”
  • データモデリングにおける適切な関連の作り方 - Qiita

    この投稿はちゅらデータアドベントカレンダー2023の4日目の記事です。 導入 RDBを使ってデータベースを構築するときは、必ずデータモデリングを行う必要があります。RDBのRは リレーション リレーショナルのRなので、テーブル同士の リレーション リレーションシップ(関連)を適切に作成することが重要です。しかし、この「適切」というのは、具体的にどういうことなのでしょうか? この記事では一つの提案として、テーブルをいくつかの種類に分けて、種類ごとの関連の条件をつけることで、システマチックに適切と思われる関連を作る方法を、披露したいと思います。 あまりよく考えていないモデリングの例 あるユーザーが、ECサイトで商品を購入して、入金されたら出荷するという、よくある構造のモデリングを行ってみます。この説明から単語を抜き出して、以下のようなテーブルが必要でないかと検討してみます。 少し単純ですが、良

    データモデリングにおける適切な関連の作り方 - Qiita
    dorapon2000
    dorapon2000 2023/12/05
    “ユーザー主導テーブルを、一度追加したら基本的には更新されないもの(トランザクションテーブル)と、ユーザー操作により何度も修正されるもの(ステートテーブル)に分ける”
  • MySQLでSQLのみを使用してランダム取得を劇的に早くする方法 - 僕のススメ。

    MySQLでランダムに20行をとるためには以下のようにやればいい。 SELECT * FROM table_name ORDER BY RAND() LIMIT 0, 20; 簡単に取得できるのはいいんだけど、行数が増えると劇的に遅い。どれくらい違うかって言うと10万行のデータベースでも↓ぐらい違う。 表示中の列 0 - 19 (20 合計, クエリの実行時間 0.0070 秒) SELECT * FROM table_name LIMIT 0 , 20 表示中の列 0 - 19 (20 合計, クエリの実行時間 1.1884 秒) SELECT * FROM table_name ORDER BY RAND() LIMIT 0, 20; なんでこんなに時間がかかるのかと調べてみると、どうも*を使うから遅いらしい。ということで、列名に主キーを指定して試してみる。 表示中の列 0 - 19

    MySQLでSQLのみを使用してランダム取得を劇的に早くする方法 - 僕のススメ。
    dorapon2000
    dorapon2000 2023/10/17
    “なんでこんなに時間がかかるのかと調べてみると、どうも*を使うから遅いらしい。ということで、列名に主キーを指定して試してみる。”
  • MySQLのB+ツリーインデックスの概要

    インデックスとは データベースのインデックスは特定のデータを検索するために使用するの索引のような データ構造です。 インデックスはテーブルのデータとは別の場所に追加の領域を確保して作成される冗長なデータです。インデックスを作成することにより元のデータが変更されることはありません。 インデックスにはテーブルのデータに対する参照が作成され、これを使用してデータの取得を高速化することができます。 インデックスによる高速化について インデックスが存在しない場合、MySQLは特定の値を見つけるためにテーブル全体を読み取る必要があります。テーブルが小さければ問題ありませんが、大きくなると処理が非常に重くなってしまいます。 インデックスを使用するとデータの取得を高速化できます。インデックスはB+ツリーというデータ構造に格納されています。このデータ構造は二分探索木をベースとしています。 二分探索木とは

    MySQLのB+ツリーインデックスの概要
  • 心穏やかにDBバージョンアップ!ロジカルレプリケーションで安全にバージョンを切り戻せるようにした話

    はじめに みなさん、DBをバージョンアップして酷い目にあったことありますよね? 先日ログラスの番データベースのバージョンアップをしたのですが、Site Reliability Engineeringの観点で非常に良いトライが出来たので共有します。 PostgreSQLのロジカルレプリケーションを使って、データを最新に保った新旧のインスタンスを用意した。結果的に安心安全にバージョンアップ作業ができました。 データベースのバージョンアップはサービス運用やっていくと絶対にやらないといけない作業ですが、影響範囲は甚大です。この記事では工夫することで、何か問題が起こってもすぐに切り戻すことが出来るという話をします。 このメンテを通じて、ログラスで利用していたAurora PostgreSQLをエンジンバージョン11.19(PG11)から15.2(PG15)にバージョンアップしました。 バージョンア

    心穏やかにDBバージョンアップ!ロジカルレプリケーションで安全にバージョンを切り戻せるようにした話
  • 1