MySQLAdvancedChapter-インデックスの作成と設計の原則

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;


4.インデックス設計の原則(継続、明日完成...)

4.1インデックスの作成にはどのような状況が適していますか?

4.2インデックスの作成に適していない状況は何ですか?

おすすめ

転載: blog.csdn.net/weixin_43823808/article/details/124105402