amamanamam

データベースと仲良くなりたいです

2023-01-01から1年間の記事一覧

Nested Loopとクエリチューニングの考え方

アンドパッドでDBREをしている久保です。この記事は ANDPAD Advent Calendar 2023 の 12日目の記事です。 初めに この記事ではMySQLの結合方法の一つであるNested Loop Joinについて紹介し、具体的なクエリの処理順について例を持って紹介します。また、それ…

EXPLAINフォーマットを作ってみるぞの話

この記事は MySQL Advent Calendar 2023 3日目の記事です。 導入 EXPLAINにはtraditional(いわゆる通常のEXPLAIN)の他にtreeやjsonのフォーマットが以下のように存在する。 --traditional mysql> explain SELECT employees.employee_id, employees.first_n…

caching_sha2_passwordの仕様の話

MySQLの認証プラグインの1つにcaching_sha2_passwordがある。 MySQL5.7ではmysql_native_passwordがデフォルトではあったが、MySQL8.0ではこやつがデフォルトとなっている(参考:リリースノート)。実際、手元で以下のように確認ができる mysql> show vari…

「テーブルをフラッシュする」とは何ぞやの話

今回はFLUSH TABLEについて取り上げる。これは一体どんな操作なのだろうか FLUSH TABLEしてみる まず適当にtestテーブルからSELECTをしてshow open tablesをするとtestテーブルがオープンされていることが分かる。 mysql> select * from test limit 5; +----…

insert intention lockについての話

環境 mysql> select version(); +--------------+ | version() | +--------------+ | 8.0.28-debug | +--------------+ 1 row in set (0.00 sec) mysql> show create table child\G *************************** 1. row *************************** Table: …

トランザクションの同時実行(動的アプローチ)

RDB

この記事は「リレーショナルデータベース入門 第3版」のトランザクションの同時実行の章の一部のサーベイです。 こちらの記事の続きです amamanamam.hatenablog.com ロック法 ここでは時間の経過とともに次々と到着するトランザクションステップをあるプロ…

INSERT...SELETC でauto_increment値が飛ぶ話

環境 CREATE TABLE `t2` ( `id` int NOT NULL, `id2` int NOT NULL AUTO_INCREMENT, PRIMARY KEY (`id`), KEY `id2` (`id2`) ) mysql> select version(); +--------------+ | version() | +--------------+ | 8.0.28-debug | +--------------+ 1 row in set …

接続要求を受けたときのメインスレッドの働きの話

クライアントから接続要求〜ユーザスレッド作成までのmysqldの御働きをバックトレースを見ながら探検する。 ついでに接続待機している部分にも寄り道する。 なお、スレッドキャッシュを空にするため、mysqldを再起動してから検証をする。 環境 mysql> select…

Connection LifecycleのConnection Phaseの話

MySQL: Connection Phaseを読んでフムフムと思ったことを実験を交えて書き記すことにした。 MySQL側ではクライアントからTCP接続が確立してから以下のようなフェーズを辿る https://dev.mysql.com/doc/dev/mysql-server/latest/page_protocol_connection_lif…

トランザクションの同時実行(静的アプローチ)

RDB

この記事は「リレーショナルデータベース入門 第3版」のトランザクションの同時実行の章の一部のサーベイです。 はてなのtex記法が上手くいかないので、定義の部分は別でtexで書いたもののキャプチャを貼るという暴挙に出ています トランザクションの同時実…

statusカラムを用意する前に考えたいことは....の話

statusカラムと題に載せているが、複数の定数を選択肢として持つような所謂enum型のカラムに関することを述べていく(statusという名で定義されることが多いような気がしたので) そのようなstatus系のカラムは楽で便利が故によく提案されると思うのだが、追…

「テーブルを開く」とは何ぞやの話

追うぞ 今回は「テーブルを開く」とは何を指す言葉なのかを追う。 fopenとやっていることは同じなら、ハンドラを作成してそのハンドラを使って各種テーブル操作ができる状態にすることである(と思う)。同じ感覚でいいのか確かめていく。 ha_innobase::open…

EXPLAIN FORMAT=JSONに表示されるコストを理解する旅に出た話

環境 mysql> select version(); +--------------+ | version() | +--------------+ | 8.0.28-debug | +--------------+ 1 row in set (0.00 sec) mysql> show create table test\G *************************** 1. row *************************** Table: t…

GTIDを用いたレプリケーションについての話

※過去qiitaに書いてた記事のお引越し https://qiita.com/boro1234/items/797b97fc06e7c688b7b2 GTIDについての説明・概要 この章ではGTIDについて簡単に解説します。 まずGTIDとは何か? GTID(Global Transaction ID)とはその名の通り、各トランザクションに…

INSERT IGNOREは何のエラーを握りつぶす子なのかの話

INSERT IGNOREとは何か 公式での説明 INSERT IGNOREを使えば、INSERT実行中の無視可能なエラーは無視してくれる。 重複エラーだけ握り潰してくれる認識だったがそうではない様子。 他に何のエラーが無視可能なんだろうか https://dev.mysql.com/doc/refman/8…