タグ

mysqlに関するtjmtmmnkのブックマーク (23)

  • デッドロックおじさん戦記 | メルカリエンジニアリング

    Mercari Advent Calendar 2017 の18日目です。 こんにちは。メルカリJPのサーバーサイドエンジニアの@Hirakuです。最近はメルカリNOWの立ち上げに関わっておりGoPHPを行ったり来たりしています。 今回はネタとしては地味ですが、2017年に遭遇した、MySQLのデッドロックの話をしようと思います。 これまでも何度か話されている通り、メルカリのコア部分は今でもPHP + MySQLで構成されており、複雑なトランザクションを含む処理が各所に存在しています。そのため、意図せずしてデッドロックを作ってしまうことがあり、場合によっては重大な問題につながります。 今年は当にデッドロックに関するトラブルに多く遭遇し、すっかり「デッドロック絶対に許さないおじさん」みたいになっていました。 事例1)出品者と購入者 デッドロックと言われてもピンと来ない方もいらっしゃるでし

    デッドロックおじさん戦記 | メルカリエンジニアリング
  • Amazon RDS Aurora MySQLでデッドロックのログを出力して読む方法

    どうしたの?スタディストwebアプリグループでは、毎朝「エラーを見る会」というものを実施しています。「エラーを見る会」は、日々発生しているサーバーエラーを把握し、顧客影響(被害)を最小限にする目的の元、webアプリグループメンバーで行われている会です。そこでは、サーバー上で出たエラーを見て、「このエラーは早めになおしたいね」とか「このエラーはバックログに積んであとでなおそう」といった話し合いを行っています。 「エラーを見る会」で、以前より「ActiveRecord::Deadlocked」の発生を確認していましたが、詳細な原因を特定できていませんでした。そこで原因特定のために、ログ出力を行った事例について今回ご紹介します。 デッドロック情報を出力する弊社では、Amazon RDS Aurora MySQLを使用しております。 原因を調べるにあたり、ストレージエンジン(InnoDB)に関する

    Amazon RDS Aurora MySQLでデッドロックのログを出力して読む方法
  • bulkのinsert on duplicate key updateでデッドロックした話 - Qiita

    VISITS Advent Calendar 22日目の記事です。 いま自分のチームではRailsのアプリケーションを運用しているのですが、MySQLのデータベースでごくまれにbulkのinsertでデッドロックが発生して原因究明に時間がかかったので、その内容を共有したいと思います。 状況 今回自分が遭遇したデッドロックは、RailsのコードからMySQLDBに対して複数件のデータを一括挿入するタイミングで発生しました。 Rails6.0からbulk insertの機能が標準サポートされたんですが、Rails6.0以前ではactiverecord-importというgemで対応するケースが多いかと思います。 運用中のアプリケーションもRails6.0以前から運用していたこともあって切り替えられていないところも多く、今回のデッドロックもactiverecord-importの箇所で発生しま

    bulkのinsert on duplicate key updateでデッドロックした話 - Qiita
  • MySQLのインデックスですが、B-treeではなくB+treeを使用するのはどうしてなのでしょうか? | mond

    MySQLのインデックスですが、B-treeではなくB+treeを使用するのはどうしてなのでしょうか? 端的に言うと性能が良いからです。 これを理解するにはバッファプールへの理解が必要です。ディスク指向のデータベースの上では有限のメモリを最大限活用することでメモリに入り切らない巨大なデータ群に対して良好な参照性能を出す必要があります。バッファプールとはディスク上のデータの羅列を固定サイズのページ(InnoDBの場合16KB)の羅列であるとして読み書きに必要な分だけをメモリに移し取り複数の書き込みをできる限りメモリ内で受け止めて後でまとめてディスクに書き戻すという、ライトバック型のキャッシュのような機構です。 この中においてバッファプールは有限のサイズしか無いので適宜プール内のデータを書き戻して入れ替えながら上手くやっていく必要があります。 さてB+treeとB-treeの最大の違いは木のリ

    MySQLのインデックスですが、B-treeではなくB+treeを使用するのはどうしてなのでしょうか? | mond
  • Aurora MySQL でレコードが存在するのに SELECT すると Empty set が返ってくる事象を調査した話

    こんにちは。 KINTO テクノロジーズの DBRE チーム所属のp2skです。 DBRE(Database Reliability Engineering)チームでは、横断組織としてデータベースに関する課題解決や、組織のアジリティとガバナンスのバランスを取るためのプラットフォーム開発などを行なっております。DBRE は比較的新しい概念で、DBRE という組織がある会社も少なく、あったとしても取り組んでいる内容や考え方が異なるような、発展途上の非常に面白い領域です。 弊社における DBRE の取り組み例としては、あわっち(@_awache)による DBRE ガードレール構想の実現に向けた取り組みについてというテックブログや、今年の AWS Summit の登壇内容を是非ご覧ください。 今回の記事は、データベースに関する課題解決の事例として「Aurora MySQL でレコードが存在するのに

  • 準同期レプリケーションで、でかいテーブルをDROP TABLEした時の死にポイント on 5.7.34

    準同期レプリケーションで、でかいテーブルをDROP TABLEした時の死にポイント on 5.7.34 TL;DR dict_sys のmutexを取るのでDDL系は死ぬし新しくテーブルキャッシュを作れないのでテーブルキャッシュが枯渇すると死ぬ ROLLBACK も dict_sys のmutexを取るので死ぬ。 COMMIT はできる。 実はGroup Replicationまたは準同期レプリケーションを使っていると、更新系DMLの中に dict_sys を使う処理が追加されるのでこっちはいきなりDMLが刺さる。 試したのは5.7.34だけ。他のバージョンの動作は知らない。この動作は単純にunlink中のmutexの話なので、バッファプールの大小にはよらない。【2022/08/01 11:21】この実験は単純にunlinkを遅延させて測っているだけなので、バッファプールの大小はまた別の問

  • ALTER TABLEにかかる実行時間を見積もりたい - tom__bo’s Blog

    運用をしているとダウンタイムかありかに関わらず、alter tableにどれくらいの時間がかかるのか作業前に把握したいことはよくあります。 各種statusを見ることで一定時間でどれくらいの行を書き換えるかを把握することはでき、作業を始めてからであれば、あとどれくらい掛かりそうかは見積もれますが、alter tableの話が出た瞬間にどれくらい掛かりそうかの目処はつけたいです。 今回はalter時に実行されるDMLがなく、テーブルに断片化もないという理想的な環境で、各種Alter操作にどれくらいの時間がかかるのかを実験してみました。 環境やconfigの詳細はあえて書いていませんが、どちらにしろ実際には様々な要因が絡むので、このくらいの情報があれば充分かと思います。 概要 alter tableにかかる時間を計測 on/off memoryでALTER TABLEにどれくらい時間がかわるか

    ALTER TABLEにかかる実行時間を見積もりたい - tom__bo’s Blog
  • 最近のMySQL 8.0 の内部一時テーブルの改善について

    MySQL では sort_buffer_size 以上にソート領域が必要になった場合、もしくは一部の条件に当てはまるSQLについては、内部一時テーブルを作成し処理を行うという仕組みになっています。 8.4.4 MySQL での内部一時テーブルの使用 この内部一時テーブルの仕組みに MySQL 8.0 から TempTable ストレージエンジンを利用する事ができるようになりました。 TempTable ストレージエンジンの挙動については、過去の弊社ブログ記事で説明しています。 TempTable ストレージエンジンについて TempTable ストレージエンジンはMySQL 8.0で導入されたということもあり、初期パッチバージョンに比べて改善が行われています。 今回の記事では、TempTableストレージエンジンの最近追加された機能についてご紹介します。 基的なソートバッファと内部一時

    最近のMySQL 8.0 の内部一時テーブルの改善について
  • 第168回 MyDumperを使ってみよう[その1] | gihyo.jp

    MySQLの論理バックアップツールというと、mysqldumpは皆さんご存知のことでしょう。mysqldumpはシリアルで処理されるため、大きなデータベースのバックアップとリストアには大変時間がかかりました。 その後mysqlpumpが登場し、これによりバックアップはパラレルで処理するため高速化されましたが、リストアはmysqldumpと同様シリアルで処理されるため、これもまた時間がかかりました。 mysqldumpmysqlpumpについては以下記事をご参照ください。 第15回 mysqldumpを使ってバックアップする 第153回 mysqlpumpを使ってバックアップを取ってみる MyDumperはバックアップとリストアをパラレルで処理するため、mysqldumpmysqlpumpよりも高速です。 ただし、最近ではMySQL ShellにMySQL Shellダンプユーティリティ

    第168回 MyDumperを使ってみよう[その1] | gihyo.jp
  • サイボウズさんの開運研修(データベース)で話してきました

    2024 ( 17 ) 4月 ( 3 ) 3月 ( 6 ) 2月 ( 1 ) 1月 ( 7 ) 2023 ( 20 ) 12月 ( 3 ) 11月 ( 3 ) 10月 ( 1 ) 8月 ( 1 ) 5月 ( 2 ) 4月 ( 2 ) 3月 ( 3 ) 2月 ( 5 ) 2022 ( 27 ) 12月 ( 5 ) 10月 ( 1 ) 9月 ( 1 ) 8月 ( 5 ) 7月 ( 4 ) 6月 ( 3 ) 4月 ( 1 ) 3月 ( 3 ) 2月 ( 2 ) 1月 ( 2 ) 2021 ( 22 ) 12月 ( 4 ) 10月 ( 2 ) 9月 ( 6 ) 7月 ( 1 ) 6月 ( 3 ) 5月 ( 3 ) 東京都オープンデータカタログサイトのCSVを使ってLOAD DATA LOCAL INFILEの練習をする サイボウズさんの開運研修(データベース)で話してきました オプティマイザヒント

  • 第113回 anemoeaterを使ってスローログを可視化してみる | gihyo.jp

    皆様あけましておめでとうございます。年も「MySQL道普請便り」をよろしくおねがいします。 新年ということで、色合いを豊かにスローログを可視化してみようと思います。今回は、スローログを時に便利なツールであるAnemometerのラッパーであるanemoeaterについて紹介していきます。 Anemometerとanemoeaterに関して Anemometerは、boxさんが作成されたスローログの可視化ツールで、ペルコナツールキットの1つであるpt-query-digestを利用して、結果を綺麗に時系列で便利に表示するためのツールです。GitHubのリンクはこちらになります。 anemoeaterは、この連載の執筆者でもあるyoku0825さんが用意したラッパーツールで、Anemometerにある問題を幾つか解決するために作成されたものとなります。特にスローログファイルだけあれば表示でき

    第113回 anemoeaterを使ってスローログを可視化してみる | gihyo.jp
    tjmtmmnk
    tjmtmmnk 2020/01/15
    時系列で表示便利そう!
  • 知って得するInnoDBセカンダリインデックス活用術!

    InnoDBはクラスタインデックスという構造になっている。今日はクラスタインデックスがどういうことかということを、皆さんに理解して頂きたい。もっとも理解して頂きたいポイントは「セカンダリインデックスのリーフノードには主キーの値が含まれている」ということだ。 主キーの構造InnoDBの主キーは次の図のように「データが主キーのリーフノードに含まれる」という構造になっている。このような構造をクラスタインデックスという。 このような構造になっていることには利点と欠点があるが、大きな利点は主キーの値で検索をすると非常に高速だということだ。主キーのリーフノードにたどり着いたときには、既にデータのフェッチも完了している。データとインデックスが別々に格納されているタイプのストレージエンジンでは、インデックスからデータの位置を読み取って、その後データファイルからデータをフェッチする。このように二段階の操作が

    知って得するInnoDBセカンダリインデックス活用術!
    tjmtmmnk
    tjmtmmnk 2019/10/24
    検索がセカンダリインデックスだけで済むようにカバリングインデックスにすれば新たにfetchする必要がなくて高速
  • ソシャゲエンジニアの自分が開発に必須だなと思った知識(MySQL編) - Qiita

    この記事の目的 自分は、とある会社様の元でソシャゲAPI 開発をさせていただいています。 ソシャゲは、リリース時やイベント時などに集中アクセスされやすく、負荷軽減の知識がない状態で開発を行ってしまうと、運用時に緊急メンテ祭りになりやすいジャンルかなと思っています。 これまで培ってきた MySQL の知識ですが、脳内メモリ量の関係上、暗記できないのでメモしておこうというのが主目的です。 ここ数年ほどソシャゲ開発しかしていないため、偏っている感がある内容ですのでご注意ください。 概要 ストレージエンジンは InnoDB。メインで扱っている MySQL バージョンは 5.6。 記事の内容ですが、これらのキーワードを見て、おおよそ分かる方は読む必要はないかと思います。 インデックス系 クラスタインデックス カバリングインデックス EXPLAIN で注意するべき値 トランザクション系 MVCC

    ソシャゲエンジニアの自分が開発に必須だなと思った知識(MySQL編) - Qiita
  • MySQLをさらに理解するために読んだ記事まとめ - $shibayu36->blog;

    最近MySQLの勉強をしていました。実践ハイパフォーマンスMySQLを読むべきという話を聞いていたのですが、かなり網羅的に書かれていて、今の知識ではどれが重要なのかわからない状態でした。そこで色々調べてみて、参考になる記事をいくつか見つけたので、少しまとめてみようと思います。 今回まとめた記事を読んで、大体以下のことが理解できました。 インデックスの使われ方とその構造(MyISAMとInnoDB) EXPLAINの詳しい使い方、見方 InnoDBの特性 ALTER TABLEの特性 レプリ遅延 まず最初に Webエンジニアのための データベース技術[実践]入門 (Software Design plus)posted with amazlet at 12.06.02松信 嘉範 技術評論社 売り上げランキング: 9767 Amazon.co.jp で詳細を見る 松信さんの書いた「Webエンジ

    MySQLをさらに理解するために読んだ記事まとめ - $shibayu36->blog;
  • MySQL :: MySQL 8.0 リファレンスマニュアル :: 8.3.1 MySQL のインデックスの使用の仕組み

    インデックスは特定のカラム値のある行をすばやく見つけるために使用されます。 インデックスがないと、MySQL は関連する行を見つけるために、先頭行から始めてテーブル全体を読み取る必要があります。 テーブルが大きいほど、このコストが大きくなります。 テーブルに問題のカラムのインデックスが含まれている場合、MySQL はすべてのデータを調べる必要なく、データファイルの途中のシークする位置をすばやく特定できます。 これはすべての行を順次読み取るよりはるかに高速です。 ほとんどの MySQL インデックス (PRIMARY KEY、UNIQUE、INDEX、および FULLTEXT) は B ツリーに格納されます。 例外: 空間データ型のインデックスは R ツリーを使用します。MEMORY テーブルはハッシュインデックスもサポートします。InnoDB は FULLTEXT インデックスの逆のリスト

    tjmtmmnk
    tjmtmmnk 2019/10/15
    “MySQL のインデックスの使用の仕組み”
  • [MySQL Workbench] VISUAL EXPLAIN でインデックスの挙動を確認する

    Lookup: where col = 1 のような等価比較 VISUAL EXPLAIN でインデックスの挙動を確かめる(題) 題です。青→赤の順にコストが大きいことだけ分かっていれば、詳細に見方を覚えなくても使えます。 今回使うのは下の2つのテーブルです。どのユーザがコンバージョンしたかを持っておく cv テーブルと、それが紐付く広告の ad テーブルです。 今回実験のためにざっくり作成したデータについて下に列挙します。 インデックスは簡単のためこの時点で PRIMARY KEY のみ cv は約100万件、 ad は約4000件 cv の status と ad の type はそれぞれ10種類で偏りなし 時刻を保存するカラムは UNIX TIME でここ一ヶ月のデータを格納 ER 図はせっかくなので MySQL Workbench で出力しました。 Workbench は外部キ

    [MySQL Workbench] VISUAL EXPLAIN でインデックスの挙動を確認する
  • 第11回 MySQL Workbenchを使って既存のデータベースからER図を作成する | gihyo.jp

    ちょっと気が早い気がしますが、そろそろ年度末に向けてさまざまな準備を考えはじめる時期だと思います。異動や入退社に備えて、ちゃんとドキュメントを整えていますか。 特にデータベースを使用しているプログラムに関しては、データベース内の情報を正しく活用するためにはどのようなデータ構造があって、どのようなデータが入力されているのかを正しく理解する必要があります。正しく理解ができていないと新規にプログラムを適切に追加したり、今までのプログラムを適切に修正することが難しくなります。 また、CREATE TABLE文やCREATE INDEX文などといった、DDL(Data Definition Language)と呼ばれるデータ構造を定義するために使われるSQLが残っているから大丈夫、という方もいらっしゃると思いますが、普段触っている環境ではなく、別のデータベースをコードやDDLを眺めながら、関連を考え

    第11回 MySQL Workbenchを使って既存のデータベースからER図を作成する | gihyo.jp
  • RDB - 実例で学ぶ、JOIN (NLJ) が遅くなる理屈と対処法 - Qiita

    "Nested Loop Joinしか取り上げて無いのにタイトルが大きすぎないか" と指摘を頂いたので、タイトルを修正しました。Merge JoinとHash Joinのことはまた今度書こうと思います。 「JOINは遅い」とよく言われます。特にRDBを使い始めて間がない内にそういう言説に触れた結果「JOIN=悪」という認識で固定化されてしまっている人も多いように感じています。 たしかに、JOINを含むようなSELECT文は、含まないものに比べて重たくなる傾向があることは事実です。また、質的に問い合わせたい内容が複雑で、対処することが難しいものも存在します。しかし、RDBの中で一体どういうことが起きているのかを知り、それに基いて対処すれば高速化できることも少なくないと考えています。 稿では、JOINの内部動作を解説した上で、Webサービスを作っているとよく出てくるJOIN SQLを例題に

    RDB - 実例で学ぶ、JOIN (NLJ) が遅くなる理屈と対処法 - Qiita
  • MySQLのexplainとかについてしらべたときのメモ - Qiita

    namespace :insert do task do: :environment do carriers = ['a', 'b', 'c'] (1..1000000).each do |i| u = User.create(name: "name#{i}", carrier: carriers[rand(3)]) u.created_at = DateTime.now - rand(365*24*3600).second u.save end end end レコード数: 100万件 carrier(簡単のためにとりあえず"a","b","c"の3種類を取るということにした) created_atはとりあえず現在から一年以内とした(DateTime.now - rand(365*24*3600).second) 結果 クエリ select carrier, date(created_a

    MySQLのexplainとかについてしらべたときのメモ - Qiita
  • Using filesort

    去年ソートに関する記事を書いたが、今日はその続きである。 MySQLでEXPLAIN SELECT...を実行するとExtraフィールドでよく見かける「Using filesort」という文字列。Filesortって一体なんだろう?と思ったことはないだろうか。単刀直入に言ってFilesortの正体はクイックソートである。 クエリにORDER BYが含まれる場合、MySQLはある程度の大きさまでは全てメモリ内でクイックソートを処理する。ある程度の大きさとはsort_buffer_sizeであり、これはセッションごとに変更可能である。ソートに必要なメモリがsort_buffer_sizeより大きくなると、テンポラリファイル(テンポラリテーブルではない)が作成され、メモリとファイルを併用してクイックソートが実行される。 Filesortは全てのソート処理において実行されるわけではない。前回の記事

    Using filesort
    tjmtmmnk
    tjmtmmnk 2019/10/11
    “サブクエリの内部でLIMITを用いるという対策”