ここの手順で Ubuntu の設定をすると MySQL データベース管理システムがインストールされています.このページでは MySQL を使った検索方法などを確認しよう.
ここの手順で 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 テーブルを作成してみます.このテーブルは id
と body
という 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>
テーブルの定義情報を確認するためのもうひとつのコマンドが
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
ではフィールドの全走査が行われるため,大きなテーブルでの検索ではパフォーマンスを期待することはできません.例えば,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 を使ったフルテキストインデックスも生成できます.