amamanamam

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

MySQL

大テーブルと小テーブルのJOINのコスト計算の話

先日MySQLアンカンファレンスでhogeさんの以下の発表を聴かせていただいた。 www.docswell.com 100万行×3行のJOINが全検索でhash joinになり、後者の行数を増やして100万行×10行にするとeq_refになる現象を紹介いただいた。 自分の環境でも同様の現象を再現…

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: …

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…

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

追うぞ 今回は「テーブルを開く」とは何を指す言葉なのかを追う。 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…