仮想開発環境の構築トップページ


MySQL を使う

ここの手順で Ubuntu の設定をすると MySQL データベース管理システムがインストールされています.このページでは MySQL を使った検索方法などを確認しよう.

目次

  1. データベース操作の基本
  2. Ngram インデックス
  3. MeCab インデックス
  4. mecab-ipadic-NEologd を使った MeCab インデックス
  5. 他のホストからの接続

データベース操作の基本

ここの手順で Ubuntu をインストールすると MySQL のバージョン 8 系がインストールされているはずです.まずはここを参照して root ユーザのパスワードを設定してください.

管理者権限でのログイン

MySQL に管理者権限(root ユーザ)でログインします.データベースの一覧を表示するには SHOW DATABASES; コマンドを利用します.管理者権限では全てのデータベースを利用することができます.

vagrant@ubuntu2204 ~ $ mysql -u root -p ⏎
Enter password: # パスワードを入力(表示されない)
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 8.0.31-0ubuntu0.22.04.1 (Ubuntu)

Copyright (c) 2000, 2022, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> SHOW DATABASES; ⏎
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)

mysql>

目次に戻る

データベースの作成

管理者権限があるとデータベースを作成することができます.例えば testDB いう名称のデータベースを作成します.

mysql> SHOW DATABASES; ⏎
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)

mysql> CREATE DATABASE testDB; ⏎
Query OK, 1 row affected (0.01 sec)

mysql> SHOW DATABASES; ⏎
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| testDB             |
+--------------------+
5 rows in set (0.00 sec)

mysql>

目次に戻る

ユーザの作成

ユーザを作成し,そのユーザに testDB データベースへのアクセス権限を与えます.ユーザ情報は mysql データベースの user テーブルに格納されています.具体的には CREATE USER コマンドで localhost から接続可能な dbuser というユーザを作成し,パスワードを設定します.その後,GRANT コマンドで testDB の全てのテーブルに対して,全ての権限をそのユーザに許可します.その後,FLUSH PRIVILEGES コマンドで権限の変更を有効化します.

mysql> USE mysql; ⏎
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> SELECT User, Host FROM user; ⏎
+------------------+-----------+
| User             | Host      |
+------------------+-----------+
| debian-sys-maint | localhost |
| mysql.infoschema | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
| root             | localhost |
+------------------+-----------+
5 rows in set (0.00 sec)

mysql> CREATE USER 'dbuser'@'localhost' IDENTIFIED BY 'hogehogehoge'; ⏎
Query OK, 0 rows affected (0.02 sec)

mysql> GRANT ALL PRIVILEGES ON testDB.* TO 'dbuser'@'localhost'; ⏎
Query OK, 0 rows affected (0.02 sec)

mysql> FLUSH PRIVILEGES; ⏎
Query OK, 0 rows affected (0.01 sec)

mysql> SELECT User, Host FROM user; ⏎
+------------------+-----------+
| User             | Host      |
+------------------+-----------+
| dbuser           | localhost |
| debian-sys-maint | localhost |
| mysql.infoschema | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
| root             | localhost |
+------------------+-----------+
6 rows in set (0.00 sec)

mysql> EXIT ⏎
Bye
vagrant@ubuntu2204 ~ $

目次に戻る

ログインとデータベースの変更

上で作成したユーザ (dbuser) で MySQL にログインします.このユーザは testDB データベースにだけ権限が付与されています.このため,root ユーザで表示されていた mysql データベースや sys データベースを見られないことに注意していください.また,利用するデータベースを変更するには USE コマンドを使います.

vagrant@ubuntu2204 ~ $ mysql -u dbuser -p ⏎
Enter password: # パスワードを入力(表示されない)
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.0.31-0ubuntu0.22.04.1 (Ubuntu)

Copyright (c) 2000, 2022, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> SHOW DATABASES; ⏎
+--------------------+
| Database           |
+--------------------+
| information_schema |
| performance_schema |
| testDB             |
+--------------------+
3 rows in set (0.00 sec)

mysql> USE testDB; ⏎
Database changed
mysql>

目次に戻る

テーブルの作成

testDB データベースに articles テーブルを作成してみます.このテーブルは idbody という 2 つの属性(フィールド,列)を持つものとします.

mysql> SHOW TABLES; ⏎
Empty set (0.00 sec)

mysql> CREATE TABLE articles (
        id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
        body TEXT
    )
    ENGINE=InnoDB CHARACTER SET utf8mb4; ⏎
Query OK, 0 rows affected (0.02 sec)

mysql> SHOW TABLES; ⏎
+------------------+
| Tables_in_testDB |
+------------------+
| articles         |
+------------------+
1 row in set (0.00 sec)

mysql>

目次に戻る

テーブルの確認

テーブルの定義を確認するひとつのコマンドが DESC です.コマンドの最後には ; または \G を入力する必要があります.; では表形式で結果が出力され,\G では縦に並べて結果が出力されます.なお,日本語 Windows 環境では円マークでバックスラッシュを入力できます.

mysql> DESC articles; ⏎
+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| id    | int unsigned | NO   | PRI | NULL    | auto_increment |
| body  | text         | YES  |     | NULL    |                |
+-------+--------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)

mysql> DESC articles\G ⏎
*************************** 1. row ***************************
  Field: id
   Type: int unsigned
   Null: NO
    Key: PRI
Default: NULL
  Extra: auto_increment
*************************** 2. row ***************************
  Field: body
   Type: text
   Null: YES
    Key:
Default: NULL
  Extra:
2 rows in set (0.01 sec)

mysql>

テーブルの定義情報を確認するためのもうひとつのコマンドが SHOW CREATE TABLE です.このコマンドでは MySQL のストレージエンジンの種類 (InnoDB が標準,そのほかに MyISAM など) や文字コードなどの情報も確認で可能です.

mysql> SHOW CREATE TABLE articles; ⏎
+----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table    | Create Table                                                                                                                                                                  |
+----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| articles | CREATE TABLE `articles` (
  `id` int unsigned NOT NULL AUTO_INCREMENT,
  `body` text,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
+----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> SHOW CREATE TABLE articles\G ⏎
*************************** 1. row ***************************
       Table: articles
Create Table: CREATE TABLE `articles` (
  `id` int unsigned NOT NULL AUTO_INCREMENT,
  `body` text,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)

mysql>

目次に戻る

データの投入

テーブルにデータを投入するには INSERT コマンドを利用します.このとき,複数のデータを一気に投入できることに注意してください.

mysql> INSERT INTO articles (body) VALUES
    ('今日の天気は雨です'),
    ('明日の天気も雨でしょう'),
    ('明日の天気も晴れでしょう'),
    ('今日の天気は晴れです'); ⏎
Query OK, 4 rows affected (0.05 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql>

続けて日本語と英語 8 件のデータを投入します.

mysql> INSERT INTO articles (body) VALUES
    ('勤務先の社内自然言語処理勉強会での発表資料です'),
    ('この文書は自然言語処理の基本として類似文書推薦について説明します'),
    ('この資料はジャズのライブについてまとめた資料です'),
    ('自然言語処理の基本を説明します'); ⏎
Query OK, 4 rows affected (0.00 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> INSERT INTO articles (body) VALUES
    ('We consider a software rejuvenation schedule.'),
    ('We propose an extended warranty service contract.'),
    ('This model evaluates the quality characteristics of software.'),
    ('複数の言語に対応した software 開発を勉強します'); ⏎
Query OK, 4 rows affected (0.02 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql>

目次に戻る

一覧表示

テーブルに保存されたデータを取得するには SELECT コマンドを利用します.コマンドの最後には通常 ; を付加します.このときは,表形式で結果出力されます.

mysql> SELECT * FROM articles; ⏎
+----+--------------------------------------------------------------------------------------------------+
| id | body                                                                                             |
+----+--------------------------------------------------------------------------------------------------+
|  1 | 今日の天気は雨です                                                                               |
|  2 | 明日の天気も雨でしょう                                                                           |
|  3 | 明日の天気も晴れでしょう                                                                         |
|  4 | 今日の天気は晴れです                                                                             |
|  5 | 勤務先の社内自然言語処理勉強会での発表資料です                                                   |
|  6 | この文書は自然言語処理の基本として類似文書推薦について説明します                                 |
|  7 | この資料はジャズのライブについてまとめた資料です                                                 |
|  8 | 自然言語処理の基本を説明します                                                                   |
|  9 | We consider a software rejuvenation schedule.                                                    |
| 10 | We propose an extended warranty service contract.                                                |
| 11 | This model evaluates the quality characteristics of software.                                    |
| 12 | 複数の言語に対応した software 開発を勉強します                                                   |
+----+--------------------------------------------------------------------------------------------------+
12 rows in set (0.00 sec)

mysql>

コマンドの最後に \G 入力すると,縦に並べて結果が表示されます.

mysql> SELECT * FROM articles\G ⏎
*************************** 1. row ***************************
  id: 1
body: 今日の天気は雨です
*************************** 2. row ***************************
  id: 2
body: 明日の天気も雨でしょう
*************************** 3. row ***************************
  id: 3
body: 明日の天気も晴れでしょう
*************************** 4. row ***************************
  id: 4
body: 今日の天気は晴れです
*************************** 5. row ***************************
  id: 5
body: 勤務先の社内自然言語処理勉強会での発表資料です
*************************** 6. row ***************************
  id: 6
body: この文書は自然言語処理の基本として類似文書推薦について説明します
*************************** 7. row ***************************
  id: 7
body: この資料はジャズのライブについてまとめた資料です
*************************** 8. row ***************************
  id: 8
body: 自然言語処理の基本を説明します
*************************** 9. row ***************************
  id: 9
body: We consider a software rejuvenation schedule.
*************************** 10. row ***************************
  id: 10
body: We propose an extended warranty service contract.
*************************** 11. row ***************************
  id: 11
body: This model evaluates the quality characteristics of software.
*************************** 12. row ***************************
  id: 12
body: 複数の言語に対応した software 開発を勉強します
12 rows in set (0.00 sec)

mysql>

目次に戻る

LIKE を使った検索

簡易的な全文検索を行うには LIKE を使います.ただし,LIKE ではフィールドの全走査が行われるため,大きなテーブルでの検索ではパフォーマンスを期待することはできません.例えば,body フィールドに「software」という文字列が含まれるレコードを検索するには次のような SQL 文を実行します.

mysql> SELECT * FROM articles
    WHERE body LIKE '%software%'; ⏎
+----+------------------------------------------------------------------+
| id | body                                                             |
+----+------------------------------------------------------------------+
|  9 | We consider a software rejuvenation schedule.                    |
| 11 | This model evaluates the quality characteristics of software.    |
| 12 | 複数の言語に対応した software 開発を勉強します                   |
+----+------------------------------------------------------------------+
3 rows in set (0.00 sec)

mysql>

「晴れ」や「自然言語」,「言語」が含まれるレコードも検索します.

mysql> SELECT * FROM articles
    WHERE body LIKE '%晴れ%'; ⏎
+----+--------------------------------------+
| id | body                                 |
+----+--------------------------------------+
|  3 | 明日の天気も晴れでしょう             |
|  4 | 今日の天気は晴れです                 |
+----+--------------------------------------+
2 rows in set (0.00 sec)

mysql>

mysql> SELECT * FROM articles
    WHERE body LIKE '%自然言語%'; ⏎
+----+--------------------------------------------------------------------------------------------------+
| id | body                                                                                             |
+----+--------------------------------------------------------------------------------------------------+
|  5 | 勤務先の社内自然言語処理勉強会での発表資料です                                                   |
|  6 | この文書は自然言語処理の基本として類似文書推薦について説明します                                 |
|  8 | 自然言語処理の基本を説明します                                                                   |
+----+--------------------------------------------------------------------------------------------------+
3 rows in set (0.00 sec)

mysql>

mysql> SELECT * FROM articles
    WHERE body LIKE '%言語%'; ⏎
+----+--------------------------------------------------------------------------------------------------+
| id | body                                                                                             |
+----+--------------------------------------------------------------------------------------------------+
|  5 | 勤務先の社内自然言語処理勉強会での発表資料です                                                   |
|  6 | この文書は自然言語処理の基本として類似文書推薦について説明します                                 |
|  8 | 自然言語処理の基本を説明します                                                                   |
| 12 | 複数の言語に対応した software 開発を勉強します                                                   |
+----+--------------------------------------------------------------------------------------------------+
4 rows in set (0.00 sec)

mysql>

目次に戻る

インデックスを使った検索

高速な検索を実行するためにはフルテキストインデックスを使った検索を行う必要があります.しかしながら,articles テーブルにはまだフルテキストインデックスを設定していないので,検索することができません.

mysql> SELECT * FROM articles
    WHERE MATCH(body) AGAINST("software"); ⏎
ERROR 1191 (HY000): Can't find FULLTEXT index matching the column list
mysql>

MySQL では Ngram を使ったフルテキストインデックスを生成することができます.さらに,MeCab をインストールしていると,MeCab を使ったフルテキストインデックスも生成できます.

目次に戻る