MySQL のメモ

実行計画(EXPLAIN ステートメント)

EXPLAIN select * from messages

-- 実行結果
/*
## id, select_type, table, partitions, type, possible_keys, key, key_len, ref, rows, filtered, Extra

'1', 'SIMPLE', 'messages', NULL, 'ALL', NULL, NULL, NULL, NULL, '997277', '100.00', NULL

*/
Column Description
id SELECT識別子。同一のクエリ内でのSELECT文の順番や、サブクエリやUNIONなどの関係を示す。
select_type SELECTクエリのタイプ。例えば、SIMPLE(単純SELECT)、SUBQUERY(サブクエリ内のSELECT)、UNION(UNIONの2番目以降のSELECT)などがある。
table クエリが参照しているテーブル名。
partitions クエリが参照しているパーティション。パーティショニングされていない場合はNULL。
type ジョインのタイプ。例えば、ALL(フルテーブルスキャン)、index(インデックス全スキャン)、range(範囲指定によるインデックス使用)など。
possible_keys クエリ実行時に使用可能なインデックス。
key 実際にクエリで使用されているインデックス。
key_len 使用されているインデックスの長さ。
ref インデックスを検索する際に参照されるカラムや定数。
rows クエリ実行によって読み込まれる行数の推定値。
filtered テーブルの行がクエリの条件にどれだけマッチするかのパーセンテージ。
Extra クエリ実行に関する追加情報。例えば、Using index(インデックスのみを使用してデータを取得)、Using where(WHERE条件を使用する)、Using temporary(一時テーブルを使用する)、などがある。
select_type
  • SIMPLE: 単純なSELECTクエリで、サブクエリやUNIONが使われていない場合。
  • PRIMARY: サブクエリやUNIONの最も外側のSELECT。
  • SUBQUERY: サブクエリ内のSELECT。最も外側ではないSELECT文。
  • DERIVED: FROM句内のサブクエリで生成された一時テーブルを参照するSELECT。
  • UNION: UNIONによって結合された二番目以降のSELECTクエリ。
  • UNION RESULT: UNIONクエリの結果を含む一時テーブル。
type
  • ALL: フルテーブルスキャン。テーブルの全行がスキャンされる。
  • index: インデックス全スキャン。インデックスの全エントリがスキャンされる。
  • range: 範囲スキャン。インデックスを使って特定の範囲の行が検索される。
  • ref: インデックスを使って、一つまたは複数の値で行が検索される。
  • eq_ref: 主キーまたはユニークキーのインデックスを使って、単一の行が検索される。
  • const: 主キーまたはユニークキーによって、単一の行が検索される。クエリ実行時に結果が定数として扱われる。
  • system: テーブルに一行のみ存在する(または空の場合)。クエリ実行時に結果が定数として扱われる。
Extra
  • Using index: クエリがインデックスのみを使用してデータを取得し、テーブルの行を読み込む必要がない場合。
  • Using where: WHERE句を使用して、特定の行をフィルタリングする場合。
  • Using temporary: クエリの結果を格納するために一時テーブルを使用する場合。例えば、ORDER BYやGROUP BYを含むクエリで一時テーブルが必要な場合。
  • Using filesort: MySQLが結果をソートするために外部のソート操作を使用する場合。インデックスを利用できないソート処理に使われる。

MySQL 8.0.18 では、EXPLAIN ANALYZE

EXPLAIN analyze select * from messages

-- 実行結果
/*
## EXPLAIN
'-> Table scan on messages  (cost=198 rows=1900) (actual time=4.43..23 rows=1900 loops=1)\n'

*/

SHOW STATUS ステートメント

MySQLサーバーに接続されているスレッドの数

SHOW STATUS WHERE `variable_name` = 'Threads_connected';

table status

SHOW TABLE STATUS LIKE 'messages';

tableのSize

SELECT 
  TABLE_SCHEMA AS `Database`, 
  TABLE_NAME AS `Table`, 
  ROUND((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024, 2) AS `Size in MB`
FROM 
  information_schema.TABLES
WHERE 
  TABLE_SCHEMA = 'ここにデータベース名を指定'
ORDER BY 
  (DATA_LENGTH + INDEX_LENGTH) DESC;

統計情報更新

ANALYZE TABLE {tableName}

-- 複数(カンマまで繋げる)
ANALYZE TABLE {tableName1},{tableName2}

クエリキャッシュの SELECT オプション

クエリ キャッシュは MySQL 5.7.20 で非推奨となり、MySQL 8.0 では削除されました。

select SQL_CACHE id from message;

エラー対応

  1. case1
Error Code: 3675. Create table/tablespace 'states' failed, as disk is full
  1. システム全体のディスク使用状況を確認

     df -h | sort -r -k 5,5
    
  2. 使用率が高いファイルシステムの特定<参考サイト CentOS ディスク容量不足の原因調査&MySQLのバイナリログ自動削除設定>

    実際の調査コマンド ```bash bash-4.4## du -sh /* 0 /bin 4.0K /boot 0 /dev 28K /docker-entrypoint-initdb.d 0 /entrypoint.sh 3.1M /etc 4.0K /home 0 /lib 0 /lib64 4.0K /media 4.0K /mnt 4.0K /opt du: cannot read directory '/proc/1/task/1/fdinfo': Permission denied du: cannot read directory '/proc/1/task/208/fdinfo': Permission denied du: cannot read directory '/proc/1/task/211/fdinfo': Permission denied du: cannot read directory '/proc/1/task/212/fdinfo': Permission denied du: cannot read directory '/proc/1/task/213/fdinfo': Permission denied du: cannot read directory '/proc/1/task/214/fdinfo': Permission denied du: cannot read directory '/proc/1/task/215/fdinfo': Permission denied du: cannot read directory '/proc/1/task/216/fdinfo': Permission denied du: cannot read directory '/proc/1/task/217/fdinfo': Permission denied du: cannot read directory '/proc/1/task/218/fdinfo': Permission denied du: cannot read directory '/proc/1/task/219/fdinfo': Permission denied du: cannot read directory '/proc/1/task/220/fdinfo': Permission denied du: cannot read directory '/proc/1/task/222/fdinfo': Permission denied du: cannot read directory '/proc/1/task/223/fdinfo': Permission denied du: cannot read directory '/proc/1/task/224/fdinfo': Permission denied du: cannot read directory '/proc/1/task/225/fdinfo': Permission denied du: cannot read directory '/proc/1/task/226/fdinfo': Permission denied du: cannot read directory '/proc/1/task/227/fdinfo': Permission denied du: cannot read directory '/proc/1/task/232/fdinfo': Permission denied du: cannot read directory '/proc/1/task/233/fdinfo': Permission denied du: cannot read directory '/proc/1/task/234/fdinfo': Permission denied du: cannot read directory '/proc/1/task/235/fdinfo': Permission denied du: cannot read directory '/proc/1/task/236/fdinfo': Permission denied du: cannot read directory '/proc/1/task/237/fdinfo': Permission denied du: cannot read directory '/proc/1/task/238/fdinfo': Permission denied du: cannot read directory '/proc/1/task/239/fdinfo': Permission denied du: cannot read directory '/proc/1/task/240/fdinfo': Permission denied du: cannot read directory '/proc/1/task/241/fdinfo': Permission denied du: cannot read directory '/proc/1/task/245/fdinfo': Permission denied du: cannot read directory '/proc/1/task/246/fdinfo': Permission denied du: cannot read directory '/proc/1/task/247/fdinfo': Permission denied du: cannot read directory '/proc/1/task/248/fdinfo': Permission denied du: cannot read directory '/proc/1/task/249/fdinfo': Permission denied du: cannot read directory '/proc/1/task/250/fdinfo': Permission denied du: cannot read directory '/proc/1/task/251/fdinfo': Permission denied du: cannot read directory '/proc/1/task/252/fdinfo': Permission denied du: cannot read directory '/proc/1/task/253/fdinfo': Permission denied du: cannot read directory '/proc/1/task/255/fdinfo': Permission denied du: cannot read directory '/proc/1/task/256/fdinfo': Permission denied du: cannot read directory '/proc/1/task/257/fdinfo': Permission denied du: cannot read directory '/proc/1/map_files': Permission denied du: cannot read directory '/proc/1/fdinfo': Permission denied du: cannot access '/proc/281/task/281/fd/3': No such file or directory du: cannot access '/proc/281/task/281/fdinfo/3': No such file or directory du: cannot access '/proc/281/task/283/fd/3': No such file or directory du: cannot access '/proc/281/task/283/fdinfo/3': No such file or directory du: cannot access '/proc/281/fd/3': No such file or directory du: cannot access '/proc/281/fdinfo/3': No such file or directory 0 /proc 20K /root 32K /run 0 /sbin 4.0K /srv 0 /sys 4.0K /tmp 541M /usr 39G /var bash-4.4## bash-4.4## du -sh /var/* 4.0K /var/adm 28K /var/cache 4.0K /var/db 4.0K /var/empty 4.0K /var/ftp 4.0K /var/games 4.0K /var/gopher 12K /var/kerberos 39G /var/lib 4.0K /var/local 0 /var/lock 4.0K /var/log 0 /var/mail 4.0K /var/nis 4.0K /var/opt 4.0K /var/preserve 0 /var/run 12K /var/spool 4.0K /var/tmp 4.0K /var/yp bash-4.4## du -sh /var/lib/* 16K /var/lib/alternatives 988K /var/lib/dnf 4.0K /var/lib/games 4.0K /var/lib/misc 39G /var/lib/mysql 4.0K /var/lib/mysql-files 4.0K /var/lib/mysql-keyring 11M /var/lib/rpm 4.0K /var/lib/rpm-state 8.0K /var/lib/selinux 4.0K /var/lib/supportinfo bash-4.4## du -sh /var/lib/mysql/* 192K /var/lib/mysql/##ib_16384_0.dblwr 8.2M /var/lib/mysql/##ib_16384_1.dblwr 101M /var/lib/mysql/##innodb_redo 804K /var/lib/mysql/##innodb_temp 44K /var/lib/mysql/0b8459b69ac1.log 148K /var/lib/mysql/attendances 4.0K /var/lib/mysql/auto.cnf 4.0K /var/lib/mysql/binlog.000061 32K /var/lib/mysql/binlog.000062 4.0K /var/lib/mysql/binlog.000063 4.0K /var/lib/mysql/binlog.000064 4.0K /var/lib/mysql/binlog.000065 4.0K /var/lib/mysql/binlog.000066 4.0K /var/lib/mysql/binlog.000067 4.0K /var/lib/mysql/binlog.000068 32K /var/lib/mysql/binlog.000069 52K /var/lib/mysql/binlog.000070 1.3M /var/lib/mysql/binlog.000071 15M /var/lib/mysql/binlog.000072 32K /var/lib/mysql/binlog.000073 8.0K /var/lib/mysql/binlog.000074 1.1G /var/lib/mysql/binlog.000075 1.1G /var/lib/mysql/binlog.000076 1.1G /var/lib/mysql/binlog.000077 1.1G /var/lib/mysql/binlog.000078 1.1G /var/lib/mysql/binlog.000079 1.1G /var/lib/mysql/binlog.000080 1.1G /var/lib/mysql/binlog.000081 285M /var/lib/mysql/binlog.000082 2.5M /var/lib/mysql/binlog.000083 1.1G /var/lib/mysql/binlog.000084 1.1G /var/lib/mysql/binlog.000085 1.1G /var/lib/mysql/binlog.000086 1.1G /var/lib/mysql/binlog.000087 732M /var/lib/mysql/binlog.000088 1.1G /var/lib/mysql/binlog.000089 1.1G /var/lib/mysql/binlog.000090 1.1G /var/lib/mysql/binlog.000091 1.1G /var/lib/mysql/binlog.000092 1.1G /var/lib/mysql/binlog.000093 1.1G /var/lib/mysql/binlog.000094 1.1G /var/lib/mysql/binlog.000095 1.1G /var/lib/mysql/binlog.000096 1.1G /var/lib/mysql/binlog.000097 1.1G /var/lib/mysql/binlog.000098 1.1G /var/lib/mysql/binlog.000099 1.1G /var/lib/mysql/binlog.000100 1.1G /var/lib/mysql/binlog.000101 1.1G /var/lib/mysql/binlog.000102 1.1G /var/lib/mysql/binlog.000103 1.1G /var/lib/mysql/binlog.000104 1.1G /var/lib/mysql/binlog.000105 734M /var/lib/mysql/binlog.000106 1.1G /var/lib/mysql/binlog.000107 1.1G /var/lib/mysql/binlog.000108 1.1G /var/lib/mysql/binlog.000109 1.1G /var/lib/mysql/binlog.000110 1.1G /var/lib/mysql/binlog.000111 1.1G /var/lib/mysql/binlog.000112 259M /var/lib/mysql/binlog.000113 367M /var/lib/mysql/binlog.000114 4.0K /var/lib/mysql/binlog.000115 4.0K /var/lib/mysql/binlog.index 4.0K /var/lib/mysql/ca-key.pem 4.0K /var/lib/mysql/ca.pem 4.0K /var/lib/mysql/client-cert.pem 4.0K /var/lib/mysql/client-key.pem 1.3M /var/lib/mysql/conference 266M /var/lib/mysql/contacts 420K /var/lib/mysql/emergencys 24K /var/lib/mysql/ib_buffer_pool 0 /var/lib/mysql/ib_buffer_pool.incomplete 12M /var/lib/mysql/ibdata1 12M /var/lib/mysql/ibtmp1 148K /var/lib/mysql/monitorings 36K /var/lib/mysql/mysql 31M /var/lib/mysql/mysql.ibd 0 /var/lib/mysql/mysql.sock 1.7M /var/lib/mysql/performance_schema 4.0K /var/lib/mysql/private_key.pem 4.0K /var/lib/mysql/public_key.pem 4.0K /var/lib/mysql/server-cert.pem 4.0K /var/lib/mysql/server-key.pem 116K /var/lib/mysql/sys 977M /var/lib/mysql/undo_001 241M /var/lib/mysql/undo_002 ```
  3. バイナリログのディスクスペース使用量を減らす方法:

    1. バイナリログの削除: MySQLではPURGE BINARY LOGSコマンドを使用して古いバイナリログを安全に削除できます。例えば、特定の日付より前の全てのログを削除するには、次のコマンドを使用します(MySQLプロンプト内で):

        PURGE BINARY LOGS BEFORE '2024-02-20 22:46:26';
      
    2. バイナリログの自動削除設定: expire_logs_days オプションをMySQLの設定ファイル(通常はmy.cnfまたはmy.ini)に追加して、古いバイナリログが自動的に削除されるように設定できます。例えば、7日より古いバイナリログを自動的に削除するには、次の行を設定ファイルに追加します:

          [mysqld]
          expire_logs_days = 7
      

関連記事