タグ

mysqlに関するbopperjpのブックマーク (109)

  • explainだけじゃわからない!MySQLのindexの考え方 - BASEプロダクトチームブログ

    はじめに こんにちは、バックエンドエンジニアのSakiです!バックエンドでPHPを書いたり、PHPという言語そのもののメンテナーもしています。 この度、注文データダウンロードAppのパフォーマンスをアップさせるため、とても入念にデータベースまわりの処理を見直しました。その中でも特に速度に関わってくる「index」についての考え方をまとめたいと思います。 この記事はMySQL(InnoDB)についての記事であり、他のRDBについては当てはまらない場合もあるということにご注意ください。 indexとは何か、おさらい ご存知の方ももちろん多いと思いますが、indexについておさらいさせてください。 indexとは辞書でいうところの目次に相当するもので、目的のデータをいち早く検索するために重要なものです。もし辞書に目次が存在しなかった場合、目的の情報を探すのにとても苦労するだろうというのは想像しや

    explainだけじゃわからない!MySQLのindexの考え方 - BASEプロダクトチームブログ
  • MySQL/Aurora/TiDBロック入門 – 第1回トランザクション分離レベル|技術ブログ|北海道札幌市・宮城県仙台市のVR・ゲーム・システム開発 インフィニットループ

    MySQL/Aurora/TiDBロック入門 – 第1回トランザクション分離レベル MySQL InnoDB および AWS Aurora や PingCAP TiDB におけるロックの仕組みやトランザクションの動作を全11回のシリーズで解説します! 最初はベースとして重要な MySQL 8.0 InnoDB 前提でユーザー視点でのロックの仕組みを学び、後半第10回以降では MySQL 互換 DB として人気の高い AWS Aurora や PingCAP TiDBMySQL InnoDB との違いについて学びます。 1回目の今回はロック機構と切っても切り離せないトランザクションとその分離レベルについて、実際に挙動を確かめながら解説します。ライブ感のある説明も理解に役立ちますので、解説動画も付けてみました。合わせてご覧ください! ★ 第1回 トランザクション分離レベル ★ 第2回 ロ

    MySQL/Aurora/TiDBロック入門 – 第1回トランザクション分離レベル|技術ブログ|北海道札幌市・宮城県仙台市のVR・ゲーム・システム開発 インフィニットループ
  • 初めてのPerformance Insights入門 – その3 | Amazon Web Services

    Amazon Web Services ブログ 初めてのPerformance Insights入門 – その3 テクニカルソリューションアーキテクトの笹川です。 前回は初めてのPerformance Insights入門 – その2 と題してPerformance Insightsと拡張モニタリングを使ってデータベースのパフォーマンスチューニングを行ってみました。パフォーマンスチューニングをする際に何を手がかりにどう確認していくのか、少しでもイメージを掴んで頂けていたら幸いです。今回も引き続き、色々なシナリオを検討しながらPerformance Insightsを使ってパフォーマンスチューニングを行ってみたいと思います。 検証環境と注意事項 記事では下記の環境で検証を行なっていきます。 RDS MySQL8.0.23 db.m3.medium (1vCPU, メモリ3.75GiB) プ

    初めてのPerformance Insights入門 – その3 | Amazon Web Services
  • 初めてのPerformance Insights入門 – その2 | Amazon Web Services

    Amazon Web Services ブログ 初めてのPerformance Insights入門 – その2 テクニカルソリューションアーキテクトの笹川です。 前回は初めてのPerformance Insights入門と題してPerformance Insightsの基的な見方や使い方をご紹介させて頂きました。Performance Insightsで何が確認できるのか、待機イベントとは何か、Performance Schemaと何が違うのか、少しでもイメージできるようになって頂けていれば幸いです。 今回は少し進んでPerformance Insightsを使ってデータベースのパフォーマンスチューニングを行ってみましょう。データベースのパフォーマンスチューニングを行ったことがない、どう考えれば良いかわからない、どこから手をつけたら良いのかイメージできない、という方の為に比較的簡単な例

    初めてのPerformance Insights入門 – その2 | Amazon Web Services
  • MySQLのSQLクエリチューニングの要所を掴む勉強会を開催しました! - ANDPAD Tech Blog

    こんにちは!DBREの福間(fkm_y)です。先月、弊社でデータベースの技術顧問をして頂いてる三谷(mita2)さんに開発部向けの「MySQL SQLチューニング」勉強会を実施していただきました。 今回はMySQLの得意不得意なことの説明やSQLチューニングの流れ、具体的な事例を元にした対応例、また最近話題のHTAPな製品も紹介していただきとても参考になったのでポイントをおさえてレポートをお伝えします! 開催背景 MySQL の得意なこと、苦手なこと データベースのチューニング手段と特徴 SQLチューニングの流れ インデックス SQLチューニング例 インデックスフルスキャンとカバーリングインデックス ソート まとめ 当日の資料 さいごに 過去開催されたデータベース勉強会レポート 開催背景 弊社では三谷さんによるデータベース勉強会を定期的に開催しています。数年前にも同じテーマで勉強会

    MySQLのSQLクエリチューニングの要所を掴む勉強会を開催しました! - ANDPAD Tech Blog
  • MySQLのCOUNTを速くする(?)SQL1本ノック その1

    この記事は MySQL Casual Advent Calendar 2016 の19日目の記事です。 「MySQLのCOUNTが遅いなー」って言うと、「トリガーでサマリーテーブル作ったら?」と言われること、多くありませんか? 特に @soudai1025 に言われる率が高い気がしています(個人の感想です) 個人的にはトリガーよりは同じトランザクションの中でカウンターテーブル(サマリーテーブルと違うもののつもりで言ってるけど、世の中でいうサマリーテーブルの中にはこの形式が含まれるかも知れない)をUPDATEする方が好き(だって、トリガーはブラックボックスになるんだもの)なんですが、頭の体操ということでトリガーで組んでみましょう。 サンプルテーブルはこんな感じ。 mysql57> SHOW CREATE TABLE game_score\G *************************

    bopperjp
    bopperjp 2024/04/18
    カウントを速くする
  • MySQL IN句とFIND_IN_SET関数

    MySQLの抽出条件の指定方法としてIN句とFIND_IN_SET関数というものがあります。 その具体的な使用方法をご紹介します。 サンプルとしてテーブル「sample」を用意します。 mysql> select * from `sample`; +----+--------+------+ | id | name | type | +----+--------+------+ | 1 | 赤井 | 1 | | 2 | 井田 | 2 | | 3 | 宇野 | 3 | | 4 | 江崎 | 1 | | 5 | 奥 | 2 | +----+--------+------+ 例えば、idが1・2・4のデータを取得したいとき、 IN句を使うとこのように抽出することができます。 SELECT * FROM sample WHERE id IN (1, 2, 4); 結果は以下のようになります。 +

    MySQL IN句とFIND_IN_SET関数
  • MySQL(InnoDB)のSQLパフォーマンスチューニングのエッセンス

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

    MySQL(InnoDB)のSQLパフォーマンスチューニングのエッセンス
  • 【20分で理解】小難しいインデックス・トランザクション・ロックを"サクッ"とMySQLでまとめてみた - Qiita

    1. インデックス MySQLで利用可能なインデックスは一部を除き、B-Treeインデックスと呼ばれる構造でできてます。Bツリーインデックスは、ブランチノード(ブランチ), リーフノード(リーフ)で構成されており、ルートノードから数ステップで目的のデータに到達することができます。 データの格納とアクセス方法 クラスタインデックス MySQLのInnoDBストレージエンジンでは、すべてのテーブルは主キー(PRIMARY KEY)によるクラスタインデックスを持ちます。クラスタインデックスとは、データ行が主キーの値によって物理的に順序付けられた状態のことを指します。このため、主キーによる検索は非常に高速です。 セカンダリインデックス セカンダリインデックスは、クラスタインデックス以外のすべてのインデックスを指します。セカンダリインデックスのリーフページ(最下層のインデックスページ)には、インデッ

    【20分で理解】小難しいインデックス・トランザクション・ロックを"サクッ"とMySQLでまとめてみた - Qiita
  • 【MySQL】InnoDBのインデックス

    エンジニアの小張です。多くのデータを扱うアプリケーションにとって、ユーザーが求めるデータを返すまでの速さは生命線とも言えます。 試行錯誤を重ねデータの蓄積量が増えれば増えるほど、アプリケーションが使いづらくなってしまったら、悲しいですよね。。。 今回はそんなレスポンス速度向上に必須の知識であるインデックスについて、構造からおさらいしていきたいと思います。 インデックスとは、 データベース上でのSELECT、WHEREなどの操作による データの集計・検索の高速化に貢献する技術の1つです。 ここでは、MySQLで使用されるInnoDBのインデックスについて説明します。 B+木(B+Tree)について MySQLのInnoDBエンジンで使われるインデックスは、B+木というデータ構造で実装されています。 InnoDBのインデックスは、以下の種類があります。 クラスタインデックス セカンダリインデッ

    【MySQL】InnoDBのインデックス
  • 第111回 MySQLのソート処理について | gihyo.jp

    クエリの抽出結果を並び替える(ソート)にはORDER BY句を使用します。MySQLではこのソートは高コストな処理のため、ソートするカラムに対してインデックスを貼ることが定石です。たとえば、以下のように 作成された記事に対して最新順に10件の取得クエリがあったとします。 mysql> SELECT * FROM article ORDER BY created_at DESC LIMIT 10; この場合は、created_atにインデックスを貼ることでソート処理を排除することができます。というのも、インデックスはすでにソート済のデータが格納されているので、先頭から順番に辿れば良いだけなのです。 さらに、MySQL 8.0とそれ以降からはDESCENDING INDEX機能が追加されたので、今回の場合はそちらを使用すると、より効果的に処理されます。また、インデックスを使用したソート処理はy

    第111回 MySQLのソート処理について | gihyo.jp
    bopperjp
    bopperjp 2024/02/26
    ソートしない(インデックスで自然にソートさせる)
  • 第91回 テーブルごとのリクエストやI/Oの統計を確認する | gihyo.jp

    番環境のMySQLにおいて、どのテーブルへの読み込みが多いのか、または書き込みが多いかなど気になることがあると思います。そんな場合に、MySQLはテーブルごとのリクエストやI/Oの統計を確認できるテーブルを提供しています。 今回は、MySQL5.6とそれ以降で閲覧可能なperformance_schemaのtable_io_waits_summary_by_tableとfile_summary_by_instanceについて紹介します。今回、使用しているMySQLのバージョンは8.0.14です。 table_io_waits_summary_by_tableテーブル table_io_waits_summary_by_tableテーブルはユーザテーブル単位の読み込み、書き込みのリクエスト回数やレイテンシーなどを集計した情報を提供します。情報を収集するためには、wait/io/table/

    第91回 テーブルごとのリクエストやI/Oの統計を確認する | gihyo.jp
  • 第148回 InnoDBの行ロック状態を確認する[その2] | gihyo.jp

    前に筆者が担当した第145回に続いて、InnoDBの行ロック状態を確認する方法について紹介します。先に第145回 InnoDBの行ロック状態を確認する[その1]をご確認ください。 今回も引き続きMySQL 8.0.23を使用しています。 data_lock_waitsテーブル MySQL 8.0から追加されたperformance_schemaのテーブルであるdata_lock_waitsテーブルは、行ロックを待機している状態を確認できます。これにより、スレッド間の行ロックの依存関係を把握することができます。data_locksテーブルのどのデータロックリクエストが、data_locksテーブルのどのデータロックによってブロックされているかを示す多対多関係が実装されています。 ロック待ちが発生していると、以下のような出力を確認できます。 mysql> SELECT * FROM perfo

    第148回 InnoDBの行ロック状態を確認する[その2] | gihyo.jp
    bopperjp
    bopperjp 2024/02/24
    ロック原因調査
  • 【MySQL】トランザクションの実行時間を調査する - stmn tech blog

    はじめに こんにちは、スタメンの松谷(@uuushiro)です。この記事では、MySQLのパフォーマンススキーマを利用し、トランザクションの実行時間を調査する方法を紹介します。なお、検証に利用した実行環境は Amazon Aurora MySQL5.7互換 です。 なぜトランザクションの実行時間を調査したいのか 過去に弊社が提供するWEBサービスのデータベースに、ALTER文などのデータ定義言語(以下DDL)をオンラインで実行した際、DDL対象のテーブルへのクエリが「Waiting for table metadata lock」という待機状態になり、結果として障害に繋がったことがありました。なぜトランザクションの実行時間を調査したいのかを説明する前に、まずこの「Waiting for table metadata lock」について少し説明します。 テーブルに対する オンライン DDL

    【MySQL】トランザクションの実行時間を調査する - stmn tech blog
  • 今日は、MySQLのクエリプロファイリングについて調べてみたの日。 - 今日はなにの日。

    目次 目次 とある日 クエリをプロファイリングするとは? パフォーマンススキーマを使用したクエリープロファイリング プロファイリング手順 履歴イベントの収集 MySQL :: MySQL 8.0 リファレンスマニュアル :: 27.12.2.1 setup_actors テーブル ステートメントおよびステージインストゥルメンテーションを有効 ステートメントおよびステージインストゥルメンテーション デフォルト設定確認 performance_schema.setup_instruments を更新する MySQL :: MySQL 8.0 リファレンスマニュアル :: 27.12.2.3 setup_instruments テーブル コンシューマを有効 events_statements*およびevents_stages* デフォルト設定確認 performance_schema.setup

    今日は、MySQLのクエリプロファイリングについて調べてみたの日。 - 今日はなにの日。
  • 「MySQL8.0 で起こる謎のデッドロックの条件を調べてみた」を data_locks・data_lock_waits テーブルで確かめてみた - Qiita

    MySQL8.0 で起こる謎のデッドロックの条件を調べてみた」を data_locks・data_lock_waits テーブルで確かめてみたMySQLMySQL8.0 これは インフラ勉強会 Advent Calendar 2018 17 日目の記事です。 ※忘れていたので後から突っ込みました。 昨日は sahya さんだった…はずです(皆さん忙しそうですね…時期が時期だけに)。 インフラ勉強会の Advent Calendar には PostgreSQL の記事を 2 入れたのですが、来わたしは MySQL 側の人ですので、ここはひとつ MySQL ネタを突っ込んでおきます。 Qrunch に、 MySQL8.0 で起こる謎のデッドロックの条件を調べてみた(bluexxsun さん) という記事が掲載されており、面白そうだったので、 MySQL 5.7と8.0でロック状態を確認す

    「MySQL8.0 で起こる謎のデッドロックの条件を調べてみた」を data_locks・data_lock_waits テーブルで確かめてみた - Qiita
  • MySQL EXPLAIN ANALYZE

    bopperjp
    bopperjp 2023/11/06
    実行計画の読み方
  • MySQLのEXPLAIN ANALYZEの読み方を勉強したよ - Qiita

    ミライトデザインアドベントカレンダー3日目です。 ミライトデザイン Advent Calendar 2021のカレンダー | Advent Calendar 2021 - Qiita 昨日は@tkek321さんのKeycloakでOIDC認可コードフローをやってみる記事でした。 OIDCを実際に動かしながら勉強できるので、凄く頭に入ってきやすい良記事でした! 日は、MySQLに関して最近自分が勉強したことを記事にさせていただきます。 概要 MySQL 8.0.18からEXPLAIN ANALYZEが導入されました。 PostgreSQLでは昔からある機能ですが、MySQLに導入されたのはつい最近のことです。 この記事ではEXPLAIN ANALYZEの読み方について、自分が学んだ内容をご紹介できればと思います。 EXPLAIN ANALYZEってそもそも何? その前にEXPLAINって何

    MySQLのEXPLAIN ANALYZEの読み方を勉強したよ - Qiita
    bopperjp
    bopperjp 2023/11/06
    実行計画(explain analyze)
  • MySQLのインデックス活用法(InnoDB) - Qiita

    データベースの検索を高速化するには、とにかくI/O(ディスクアクセス)の回数を減らすことが重要とのことです。 そのための方法のひとつが、インデックスになります。 学習を深めるに当たって、かなりいろいろなサイトを参考にさせていただいたので、参考リンク&引用元として載せております。素晴らしい記事を書いてくださった皆様に感謝です。 mysql 5.5〜(InnoDB) (記事作成:2016年3月) 目次 インデックススキャンとは インデックスのアルゴリズムと B-Tree インデックスの種類 複合インデックスと Covering Index インデックススキャンとは データベースの問い合わせ手法として、シーケンシャルスキャンとインデックススキャン、フルテーブルスキャンがあります。 シーケンシャルスキャン (Sequential Scan) シーケンシャルスキャン(順次検索)は、すべてのデータを順

    MySQLのインデックス活用法(InnoDB) - Qiita
  • オンライン DDL を期待して ALTER 文を実行したら障害になりかけた話 - カミナシ エンジニアブログ

    こんにちは。ソフトウェアエンジニアの坂井 (@manabusakai) です。 カミナシではマルチプロダクト化に向けて、認証・認可の切り出しを進めています。その対応を進める中で、既存テーブルへのカラム追加が必要になりました。 先日、そのリリースのために番データベースにマイグレーションの ALTER 文を実行したところ、クエリが詰まって危うく障害になるところでした(幸いすぐにキャンセルして事なきを得ました)。 原因を調べたところ、オンライン DDL は複数の条件が関係することがわかりました。オンライン DDL に対する知識不足と事前検証の甘さゆえのミスでしたが、結果的には良い学びが得られました。 カミナシのバリューのひとつである「全開オープン」の気持ちで、事の顛末やそこから得た学びを公開します。 なお、今回の話は MySQL 5.7 互換の Amazon Aurora MySQL 2 で確

    オンライン DDL を期待して ALTER 文を実行したら障害になりかけた話 - カミナシ エンジニアブログ