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;