Capítulo Avançado do MySQL - Princípios de Criação e Design de Índice

1. Classificação dos índices

Os índices MySQL incluem índices comuns, índices exclusivos, índices de texto completo, índices de coluna única, índices de várias colunas e índices espaciais.
Em termos de lógica funcional , existem quatro tipos principais de índices, ou seja, índices comuns, índices exclusivos, índices de chave primária e índices de texto completo.
De acordo com a implementação física , os índices podem ser divididos em dois tipos: índices clusterizados e índices não clusterizados.
É dividido em índice de coluna única e índice conjunto de acordo com o número de campos de ação .


2. Três maneiras de criar um índice

2.1 Método 1: CRIAR TABELA

2.1.1 Pequeno exemplo

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 Índice Comum

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;

Se escrevermos uma instrução sql simples e filtrarmos por book_name depois de onde, podemos usar a ferramenta de análise de desempenho de explicação para ver como é?

EXPLAIN 
SELECT *
FROM book
WHERE book_name = 'mysql';

2.1.3 Índice Único

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;

Em seguida, insira três registros na tabela por vez, ao inserir o segundo registro, um erro será relatado. E o terceiro registro é executado normalmente.

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);

Eventualmente, na tabela book1, haverá dois registros.

2.1.4 Índice de chave primária

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 Índice de coluna única

Na verdade, os que criamos acima são todos índices de coluna única.

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 Índice Conjunto

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;

Vamos analisar através de dois SQLs, como fica o índice conjunto no processo de busca?

EXPLAIN 
SELECT *
FROM book4
WHERE book_id = 1001 AND book_name = 'mysql';

Explicação: Como o índice conjunto que construímos está na ordem de book_id, book_name, info, portanto, ao construir uma árvore B+, primeiro classificamos por book_id e, quando book_id é o mesmo, classificamos por book_name e quando book_name é o mesmo , Finalmente, classifique por info. (Na árvore B+, book_name está localizado abaixo de book_id, e a pesquisa deve primeiro passar por book_id e depois book_name)

Portanto, o sql acima irá para book_id primeiro, depois book_name.

EXPLAIN 
SELECT *
FROM book4
WHERE book_name = 'mysql';

Após a análise acima, por que esse sql não pega o índice conjunto? (Este book_name não está no índice conjunto?), aqui está na verdade um problema de ordem de construção da árvore B+. Se você quiser usar o índice book_name no filtro where, você deve primeiro usar o índice book_id, porque book_name está no índice conjunto. Ele está localizado depois do book_id, então book_name está abaixo do book_id na árvore B+. Você ainda não atingiu o segundo nível (hipotético) da árvore B+, então como você pode alcançar o terceiro nível do B+ árvore? Então esse sql não passará pelo index.

2.1.7 Indexação de texto completo

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 Método 2: ALTER TABLE ... ADD INDEX ...

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 Método 3: CRIAR ÍNDICE ... 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. Duas maneiras de excluir um índice

3.1 Use ALTER TABLE para excluir índices

3.2 Use a instrução DROP INDEX para descartar um índice

Quando solicitado a eliminar uma coluna em uma tabela, se a coluna a ser eliminada fizer parte do índice, a coluna também será eliminada do índice. Se todas as colunas que compõem o índice forem eliminadas, todo o índice será eliminado.
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. Princípios de design do índice (a ser continuado, a ser concluído amanhã...)

4.1 Quais situações são adequadas para criar um índice?

4.2 Quais situações não são adequadas para a criação de um índice?

Acho que você gosta

Origin blog.csdn.net/weixin_43823808/article/details/124105402
Recomendado
Clasificación