書籍「MySQL徹底入門 第4版 MySQL 8.0対応」のまとめ。
点数
82点
感想
インストール方法に始まり、必要な情報が一通り網羅されていた。
個人的には、全文検索に関する説明がとても勉強になった。
基本
バージョン番号
X.Y.ZのXがメジャーバージョン、Yがマイナーバージョン、Zがリリース番号である。
しかし実際のところ,互換性やドキュメントはX.Yの「シリーズ」が単位となることから,X.Yがメジャーバージョン(シリーズ),Zがマイナーバージョンとして呼ばれることが多くなっている。
5.7の次が8.0になっているが、6.0はGAになることはなく5.4に統合された。
(5.4もGAになることはなく、5.5としてリリースされた)
7.0はMySQL Clusterで使用されているためスキップされた。
OracleはMySQLの本体とその周辺ツールのバージョンを揃えたかったため、5.7に次を8.0にした。
安定版をGA(General Availability)と呼ぶ。
安定版の前のリリースには、-dmr(Development Milestone Release)が付く。
安定版直前のリリースには、–RC(Release Candidate)が付く。
Yumでのインストール
インストールの前に、インストール済みのMySQLがないかを確認する。
- 確認
rpm -qa | grep -i mysql
- 削除
rpm -ev mysql パッケージ名
インストール手順
- YumリポジトリRPMをインストール
https://dev.mysql.com/downloads/repo/yum/からOSに合ったRPMファイルをダウンロード。
※ CentOS 8の場合はRed Hat Enterprise Linux 8 を選択するyum localinstall rpmファイル
例)yum localinstall mysql80-community-release-el7-3.noarch.rpm
yum repolist enabled | grep "mysql.*-communnity.*"
で確認。 - MySQLをインストール
CentOS 8ではMySQLモジュールリストを無効化しておく必要がある。dnf module disable mysql
※yumの後継であるdnfではモジュール機能が追加され、バージョンを選んでインストールをすることができるyum install mysql-community-server
※ サーバー(mysql-community-server)、クライアント(mysql-community-client)、エラーメッセージと文字セット(mysql-community-common)、共有クライアントライブラリ(mysql-community-libs)、などがインストールされる。 - MySQLサーバーの起動
systemctl start mysqld.service
※ 末尾の.serviceは省略可能
※ エラー時はログ/var/log/mysqld.logを確認する。
初回起動時にデータベースファイルが初期化され、/var/lib/mysql/にデータベースファイルが作成される。
設定ファイルは/etc/my.cnfが使用される。
初期パスワード
データベースファイル初期化時にrootパスワードが設定される。grep 'temporary password' /var/log/mysqld/log
で確認する。
初期パスワードのままだと操作が制限されるため、ALTER USER 'root'@'localhost' IDENTIFIED BY '新パスワード'
で変更する。
Docker環境の構築
イメージの検索
docker search mysql
でDocker Hubのイメージを検索することができる。
- mysql
Docker公式イメージ - mysql/mysql-server
Oracle公式イメージ
Oracle公式イメージはLinuxのみのサポートとなっている。
Docker社公式イメージはARM版が存在しないため、M1 Macでは使えないらしい。
構築手順(mysql/mysql-serverイメージの場合)
- イメージのダウンロード
docker image pull mysql/mysql-server
- コンテナ起動
docker container run --name mysql1 -d mysql/mysql-server
- 初期パスワードの確認
docker logs mysql1 2>&1 | grep GENERATED
Oracle公式イメージはコンテナ化する度にパスワードが変わるので、毎回確認する必要がある。 - 初期パスワードの変更
docker exec -it mysql1 bash mysql -uroot -p ALTER USER 'root'@'localhost' IDENTIFIED BY '新パスワード'
SQL
テーブルとインデックスの作成
テーブルの作成
CREATE TABLE テーブル名(列名 型, 列名 型) DEFAULT CHARACTER SET=文字コード DEFAULT COLLATE=コレーション ENGINE=InnoDB;
※ DEFAULT CHARACTER SET等は、省略した場合はデータベースに設定された値が使用される。
インデックスの作成
CREATE INDEX インデックス名ON テーブル名 (列);
※ インデックスにALTER文を使うことはできないため、インデックスの変更はDROPしてからCREATEする必要がある。
WHERE文
WHERE文の値にサブクエリを使う場合
INの場合は1列の値を複数返すもの、IN以外の場合は1列の値を1つだけ返すもの、でなければならない。
SELECT * FROM tbl1 WHERE col1 IN (SELECT col2 FROM tbl2 WHERE category='1')
WHERE文のカラムや値に関数を使う場合
インデックスが張ってあるカラムの場合、関数を使うとインデックスが適用されなくなるので注意。SELECT * FROM tbl1 WHERE LEFT(col1, 2)= '01'
WINDOW関数
MySQL8.0ではWINDOW関数が使えるようになった。
「行をひとつにまとめないGROUP BY」のようなもので、かなり便利。https://hit.hateblo.jp/entry/MYSQL/8.0/WINDOW
多くのRDBMSでWINDOW関数を使うことができ、SQL:2003 以降の標準SQLでも規定されている。
使用例
col1とcol2の組み合わせをグループとし、col3の小さい順に1から番号を振った値をrnkカラムとして返す。SELECT id, RANK() OVER (PARTITION BY col1, col2 ORDER BY col3) AS rnk FROM tbl1;
データ型
CHAR型は末尾のスペースが削除される
MySQLではVARCHAR型の末尾のスペースは保持されるが、CHAR型の末尾のスペースは保持されない。
例えば、「aaa 」という値をINSERTしても、SELECTすると「aaa」となる。
col1がCHAR(4)の場合INSERT INTO hoge(col1) values('aa ');
SELECT col1 FROM hoge;
の結果は「aa」となる。
ENUM型
テーブル生成時にENUMで宣言した値のみ登録可能な列となる。CREATE TABLE tbl1(hoge ENUM('Apple', 'Orange', 'Banana'));
値の判定はコレーション(照合順位)に依存する。
大文字小文字を区別しないコレーションの場合、’Apple’のENUMに’apple’でも登録できる。
その場合、登録された値はENUMで指定された’Apple’となる。
※ TEXT型やENUM型は標準SQLではない、MySQL独自仕様