サイトアイコン 上尾市のWEBプログラマーによるブログ

「MySQL徹底入門 第4版 MySQL 8.0対応」の感想・備忘録1

書籍「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がないかを確認する。

インストール手順

  1. 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.*"で確認。
  2. 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)、などがインストールされる。
  3. 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のイメージを検索することができる。

Oracle公式イメージはLinuxのみのサポートとなっている。
Docker社公式イメージはARM版が存在しないため、M1 Macでは使えないらしい。

構築手順(mysql/mysql-serverイメージの場合)

  1. イメージのダウンロード
    docker image pull mysql/mysql-server
  2. コンテナ起動
    docker container run --name mysql1 -d mysql/mysql-server
  3. 初期パスワードの確認
    docker logs mysql1 2>&1 | grep GENERATED
    Oracle公式イメージはコンテナ化する度にパスワードが変わるので、毎回確認する必要がある。
  4. 初期パスワードの変更
    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独自仕様

モバイルバージョンを終了