アプリケーション開発ポータルサイト
ServerNote.NET
ServerNote.NET厳選キャンペーン・クーポンはこちら!
カテゴリー【MySQL
【MySQL】テーブル定義を確認してインデックスを操作する【MariaDB】
POSTED BY
2023-01-20

すぐに忘れてしまうのでメモ。

まずはテーブル定義を確認する。

show create table article;

| Table   | Create Table                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             | article | CREATE TABLE `article` (
  `id` varchar(128) NOT NULL,
  `title` text NOT NULL,
  `plain` text NOT NULL,
  PRIMARY KEY (`id`),
  FULLTEXT KEY `title` (`title`),
  FULLTEXT KEY `plain` (`plain`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 |

インデックスがいくつかあるようだ。詳細を確認する。

show index from article;
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+
| Table   | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Ignored |
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+
| article |          0 | PRIMARY  |            1 | id          | A         |           2 |     NULL | NULL   |      | BTREE      |         |               | NO      |
| article |          1 | title    |            1 | title       | NULL      |        NULL |     NULL | NULL   |      | FULLTEXT   |         |               | NO      |
| article |          1 | plain    |            1 | plain       | NULL      |        NULL |     NULL | NULL   |      | FULLTEXT   |         |               | NO      |
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+

上記フルテキストインデックスでの検索だが、ちゃんと含む文字列を指定しているのに出なかったり、いまいちなので、通常のインデックスに変更したい。よって、まずこの全文検索インデックスどもを削除する。

drop index title on article;
Query OK, 0 rows affected (0.011 sec)
Records: 0  Duplicates: 0  Warnings: 0

drop index plain on article;
Query OK, 0 rows affected (0.015 sec)
Records: 0  Duplicates: 0  Warnings: 0

削除されたか確認

show index from article;
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+
| Table   | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Ignored |
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+
| article |          0 | PRIMARY  |            1 | id          | A         |           0 |     NULL | NULL   |      | BTREE      |         |               | NO      |
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+

show create table article;
| Table   | Create Table                                                                                                                                                                                                                                                                                                                                                                                                                                                                         | article | CREATE TABLE `article` (
  `no` float NOT NULL,
  `id` varchar(128) NOT NULL,
  `date` timestamp NOT NULL DEFAULT current_timestamp(),
  `upd_date` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
  `title` text NOT NULL,
  `honbun` text NOT NULL,
  `plain` text NOT NULL,
  `display` text NOT NULL,
  `category` varchar(128) NOT NULL,
  `status` smallint(6) NOT NULL DEFAULT 0,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 |

通常のインデックスに作り直す

create index title on article(title);
Query OK, 0 rows affected, 1 warning (0.004 sec)
Records: 0  Duplicates: 0  Warnings: 1

create index plain on article(plain);
Query OK, 0 rows affected, 1 warning (0.009 sec)
Records: 0  Duplicates: 0  Warnings: 1

作成されたか確認

show create table article;
| Table   | Create Table                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       | article | CREATE TABLE `article` (
  `no` float NOT NULL,
  `id` varchar(128) NOT NULL,
  `date` timestamp NOT NULL DEFAULT current_timestamp(),
  `upd_date` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
  `title` text NOT NULL,
  `honbun` text NOT NULL,
  `plain` text NOT NULL,
  `display` text NOT NULL,
  `category` varchar(128) NOT NULL,
  `status` smallint(6) NOT NULL DEFAULT 0,
  PRIMARY KEY (`id`),
  KEY `title` (`title`(1024)),
  KEY `plain` (`plain`(1024))
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 |

show index from article;
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+
| Table   | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Ignored |
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+
| article |          0 | PRIMARY  |            1 | id          | A         |           0 |     NULL | NULL   |      | BTREE      |         |               | NO      |
| article |          1 | title    |            1 | title       | A         |           0 |     1024 | NULL   |      | BTREE      |         |               | NO      |
| article |          1 | plain    |            1 | plain       | A         |           0 |     1024 | NULL   |      | BTREE      |         |               | NO      |
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+

んん…??1024ってなんだ??と調べたら、Sub_partといって、最初の1024バイトのみをインデックスするということらしい。これを256バイトとかにしたければ、

create index title on article(title(256));

などと指定するらしいが、全文検索インデックスではデフォルトはNULL=文字数無制限=であったと思うので、同じように1024でなく無制限にしたい。

なのでNULLを指定して作り直そうとしたら…

drop index plain on article;
Query OK, 0 rows affected (0.006 sec)
Records: 0  Duplicates: 0  Warnings: 0

create index plain on article(plain(NULL));
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'NULL))' at line 1

と、怒られてエラーになってしまった。NULLでなく256とかなら成功するので、通常インデックスは最大でも1024バイトまでなのか…??MariaDBだからかもしれないが…。

医薬部外品「薬用VCボディミスト」背中ニキビ・デコルテにビタミンCニキビケア
薬用VCボディミストは、ニキビケア・マラセチア菌を殺菌する成分、 美白成分などを贅沢に配合したボディニ...READ MORE
生活トラブルをスピーディに解決!24時間365日受付対応【生活110番】
生活110番は生活の中で発生するお困りごとやトラブルを解決する専門業者をご紹介するサイトになります。 約...READ MORE
愛犬の可愛らしい姿を撮影して自慢しよう!【Furboドッグカメラ】
Furbo(ファーボ)は、 ドッグオーナー、獣医、ドッグトレーナーなど 5,000人以上の愛犬家の声を反映させ、...READ MORE
※本記事は当サイト管理人の個人的な備忘録です。本記事の参照又は付随ソースコード利用後にいかなる損害が発生しても当サイト及び管理人は一切責任を負いません。
※本記事内容の無断転載を禁じます。
【webmaster/管理人】
自営業プログラマー
ご連絡は以下アドレスまで★

☆ServerNote.NETショッピング↓
ShoppingNote
☆お仲間ブログ↓
一人社長の不動産業務日誌
【キーワード検索】