1.インデックスの分類
MySQL インデックスには、共通インデックス、一意のインデックス、フルテキストインデックス、単一列インデックス、複数列インデックス、および空間インデックスが含まれます。機能 ロジックに関しては 、インデックスには主に 4つの タイプがあります。つまり、通常のインデックス、一意のインデックス、主キーインデックス、およびフルテキストインデックスです。物理的な 実装に応じて、インデックスはクラスター化インデックスと非クラスター化インデックスの2つのタイプ に分けることができます。アクション フィールドの数に応じて、 単一列インデックスとジョイントインデックスに分けられます。
2.インデックスを作成する3つの方法
2.1方法1:CREATE TABLE
2.1.1小さな例
CREATE DATABASE dbtest2;
USE dbtest2;
CREATE TABLE dept (
dept_id INT PRIMARY KEY AUTO_INCREMENT,
dept_name VARCHAR(20)
);
SHOW INDEX FROM dept;
CREATE TABLE emp (
emp_id INT PRIMARY KEY AUTO_INCREMENT,
emp_name VARCHAR(20) UNIQUE,
dept_id INT,
CONSTRAINT fk_emp_dept_id FOREIGN KEY(dept_id) REFERENCES dept(dept_id)
);
SHOW INDEX FROM emp;
2.1.2共通インデックス
CREATE TABLE book (
book_id INT,
book_name VARCHAR(100),
`authors` VARCHAR(100),
info VARCHAR(100),
`comment` VARCHAR(100),
year_publication YEAR,
INDEX idx_bname(book_name)
);
SHOW INDEX FROM book;
単純なSQLステートメントを記述し、その後にbook_nameでフィルターをかけると、explainパフォーマンス分析ツールを使用してどのように見えるかを確認できますか?
EXPLAIN
SELECT *
FROM book
WHERE book_name = 'mysql';
2.1.3一意のインデックス
CREATE TABLE book1 (
book_id INT,
book_name VARCHAR(100),
`authors` VARCHAR(100),
info VARCHAR(100),
`comment` VARCHAR(100),
year_publication YEAR,
UNIQUE INDEX uk_idx_cmt(`comment`)
);
SHOW INDEX FROM book1;
次に、3つのレコードを順番にテーブルに挿入します。2番目のレコードを挿入すると、エラーが報告されます。そして、3番目のレコードは正常に実行されます。
INSERT INTO book1(book_id, book_name, `comment`)
VALUES(1, 'MySQL高级', '适合有数据库开发经验的人员学习');
INSERT INTO book1(book_id, book_name, `comment`)
VALUES(1, 'MySQL高级', '适合有数据库开发经验的人员学习');
INSERT INTO book1(book_id, book_name, `comment`)
VALUES(1, 'MySQL高级', NULL);
最終的に、テーブルブック1には2つのレコードがあります。
2.1.4主キーインデックス
CREATE TABLE book2 (
book_id INT PRIMARY KEY,
book_name VARCHAR(100),
`authors` VARCHAR(100),
info VARCHAR(100),
`comment` VARCHAR(100),
year_publication YEAR
);
SHOW INDEX FROM book2;
2.1.5単一列インデックス
実際、上記で作成したものはすべて単一列のインデックスです。
CREATE TABLE book3 (
book_id INT ,
book_name VARCHAR(100),
AUTHORS VARCHAR(100),
info VARCHAR(100) ,
COMMENT VARCHAR(100),
year_publication YEAR,
UNIQUE INDEX idx_bname(book_name)
);
SHOW INDEX FROM book3;
2.1.6ジョイントインデックス
CREATE TABLE book4 (
book_id INT ,
book_name VARCHAR(100),
AUTHORS VARCHAR(100),
info VARCHAR(100) ,
COMMENT VARCHAR(100),
year_publication YEAR,
INDEX mul_bid_bname_info(book_id, book_name, info)
);
SHOW INDEX FROM book4;
2つのSQLを分析してみましょう。検索プロセスでは、ジョイントインデックスはどのように機能しますか?
EXPLAIN
SELECT *
FROM book4
WHERE book_id = 1001 AND book_name = 'mysql';
説明:作成したジョイントインデックスはbook_id、book_name、infoの順序であるため、B +ツリーを作成するときは、最初にbook_idで並べ替え、book_idが同じ場合は、book_nameで並べ替え、book_nameが同じ場合は並べ替えます。 、最後に、情報で並べ替えます。(B +ツリーでは、book_nameは実際にはbook_idの下にあり、検索では最初にbook_id、次にbook_nameを実行する必要があります)
したがって、上記のSQLは最初にbook_idに移動し、次にbook_nameに移動します。
EXPLAIN
SELECT *
FROM book4
WHERE book_name = 'mysql';
上記の分析の後、なぜこのSQLはジョイントインデックスを取得しないのですか?(このbook_nameはジョイントインデックスに含まれていませんか?)実際には、B +ツリーを構築する順序の問題があります。whereフィルターでbook_nameインデックスを使用する場合は、book_nameであるため、最初にbook_idインデックスを使用する必要があります。はジョイントインデックスにあります。book_idの後にあるため、book_nameはB +ツリーのbook_idの下にあります。B+ツリーの第2レベル(仮想)に到達していないので、どうすればB+の第3レベルに到達できますか。木?したがって、このSQLはインデックスを通過しません。
2.1.7全文索引付け
CREATE TABLE test4 (
id INT NOT NULL,
NAME CHAR(30) NOT NULL,
age INT NOT NULL,
info VARCHAR(255),
FULLTEXT INDEX futxt_idx_info(info(50))
);
SHOW INDEX FROM test4;
2.2方法2:ALTER TABLE ... ADDINDEX..。
DROP TABLE IF EXISTS book5;
CREATE TABLE book5 (
book_id INT ,
book_name VARCHAR(100),
`authors` VARCHAR(100),
info VARCHAR(100) ,
`comment` VARCHAR(100),
year_publication YEAR
);
ALTER TABLE book5 ADD INDEX idx_cmt(`comment`);
ALTER TABLE book5 ADD UNIQUE INDEX uk_idx_bname(book_name);
ALTER TABLE book5 ADD INDEX mul_bid_bname_info(book_id, book_name, info);
SHOW INDEX FROM book5;
2.3方法3:CREATE INDEX ...ON..。
DROP TABLE IF EXISTS book6;
CREATE TABLE book6 (
book_id INT ,
book_name VARCHAR(100),
`authors` VARCHAR(100),
info VARCHAR(100) ,
`comment` VARCHAR(100),
year_publication YEAR
);
CREATE INDEX idx_cmt ON book6(`comment`);
CREATE UNIQUE INDEX uk_idx_bname ON book6(book_name);
CREATE INDEX mul_bid_bname_info ON book6(book_id, book_name, info);
SHOW INDEX FROM book6;
3.インデックスを削除する2つの方法
3.1ALTERTABLEを使用してインデックスを削除する
3.2DROPINDEXステートメントを使用してインデックスを削除します
テーブルに列をドロップするように求められたときに、ドロップする列がインデックスの一部である場合、その列もインデックスからドロップされます。インデックスを構成するすべての列が削除されると、インデックス全体が削除されます。
ALTER TABLE book6 DROP INDEX idx_cmt;
DROP INDEX uk_idx_bname ON book6;
ALTER TABLE book6 DROP COLUMN book_name;
ALTER TABLE book6 DROP COLUMN book_id;
ALTER TABLE book6 DROP COLUMN info;
SHOW INDEX FROM book6;