Motor de índice, transacciones y almacenamiento MySQL (¡gráficos y texto detallados!) (1)

Motor de índice, transacciones y almacenamiento MySQL (¡gráficos y texto detallados!) (1)


Preparación: primero cree una base de datos y una tabla

mysql -u root -p

create database SCHOOL;
use SCHOOL;
create table class (id int(10) not null,name varchar(10) not null,cardid varchar(18),phone varchar(11),address varchar(50));

desc class;

insert into class values (1,'zhangsan','12','111111','nanjing');
insert into class values (4,'lisi','123','444444','suzhou');
insert into class values (2,'wangwu','1234','222222','beijing');
insert into class values (5,'zhaoliu','12345','555555','nanjing');
insert into class values (3,'qianqi','123456','333333','shanghai');

select * from class;

Inserte la descripción de la imagen aquí

Insertar datos y ver la estructura de la tabla

Inserte la descripción de la imagen aquí

Uno, índice MySQL

1. El concepto de índice

1) El índice es una lista ordenada, en la que se almacenan el valor del índice y la dirección física de la fila que contiene el valor de los datos (similar a la lista enlazada en lenguaje C apunta a la dirección de memoria del registro de datos a través del puntero).
2) Después de usar el índice, puede ubicar los datos de una fila sin escanear toda la tabla, pero primero busque la dirección física correspondiente a la fila de datos a través de la tabla de índice y luego acceda a los datos correspondientes, por lo que la velocidad de consulta del la base de datos se puede acelerar.
3) El índice es como una tabla de contenido de un libro, puede encontrar rápidamente el contenido que necesita de acuerdo con el número de página en la tabla de contenido.
4) El índice es un método para clasificar los valores de una o varias columnas en una tabla.
5) El propósito de la indexación es acelerar la búsqueda u ordenación de registros en la tabla.

2. La función del índice

1) Después de configurar un índice adecuado, la base de datos utiliza varias tecnologías de posicionamiento rápido para acelerar en gran medida la velocidad de consulta. Esta es la razón principal para crear un índice.
2) Cuando la tabla es muy grande o la consulta involucra varias tablas, el uso de índices puede aumentar la velocidad de la consulta miles de veces.
3) El costo de E / S de la base de datos se puede reducir y el índice también puede reducir el costo de clasificación de la base de datos.
4) Al crear un índice único, se puede garantizar la unicidad de cada fila de datos en la tabla de datos.
5) Puede acelerar la conexión entre la mesa y la mesa.
6) Cuando se utiliza la agrupación y la clasificación, el tiempo para la agrupación y la clasificación se puede reducir considerablemente.

3. Efectos secundarios de la indexación

1) El índice requiere espacio adicional en disco.

  • Para el motor MyISAM, el archivo de índice y el archivo de datos están separados, y el archivo de índice se usa para guardar la dirección del registro de datos.
  • El archivo de datos de la tabla del motor InnoDB en sí es el archivo de índice.

2) Se necesita más tiempo para insertar y modificar datos, porque el índice también cambiará en consecuencia.

4. La base principal para la creación de un índice

Los índices pueden aumentar la velocidad de las consultas de la base de datos, pero no son adecuados para crear índices en todas las circunstancias. Debido a que el índice en sí mismo consume recursos del sistema, si hay un índice, la base de datos primero realizará una consulta de índice y luego ubicará una fila de datos específica. Si el índice se usa incorrectamente, aumentará la carga sobre la base de datos.

1) La clave principal y la clave externa de la tabla deben tener índices. Debido a que la clave principal es única, la clave externa está relacionada con la clave principal de la tabla principal, que se puede ubicar rápidamente al realizar consultas.
2) Las tablas con más de 300 filas de registros deben tener índices. Si no hay un índice, es necesario recorrer la tabla para cada consulta, lo que afectará seriamente el rendimiento de la base de datos.
3) Para las tablas que se conectan con frecuencia a otras tablas, se debe establecer un índice en el campo de conexión.
4) Los campos con poca unicidad no son adecuados para la indexación.
5) Los campos que se actualizan con demasiada frecuencia no son adecuados para la creación de índices.
6) Los campos que aparecen a menudo en la cláusula where, especialmente los campos de tablas grandes, deben indexarse.
7) Los índices deben construirse en campos altamente selectivos.
8) Los índices deben construirse en campos pequeños. No cree índices para campos de texto grandes o incluso campos largos.

(1) Clasificación y creación de índices

1. Índice ordinario

  • El tipo de índice más básico, no hay restricciones como la unicidad

1.1 Crear un índice directamente

CREATE INDEX 索引名 ON 表名 (列名[(length)]);
#(列名(length)):length是可选项,下同。如果忽略 length 的值,则使用整个列的值作为索引。如果指定使用列前的 length 个字符来创建索引,这样有利于减小索引文件的大小。
#索引名建议以“_index”结尾。

例:
create index phone_index on class (phone);
show keys from class\G;

Inserte la descripción de la imagen aquí

1.2 Modificar la creación de tablas

ALTER TABLE 表名 ADD INDEX 索引名 (列名);

例:
alter table class add index id_index (id);
show keys from class\G;

Inserte la descripción de la imagen aquí

1.3 Especifique el índice al crear la tabla

CREATE TABLE 表名 ( 字段1 数据类型,字段2 数据类型[,...],INDEX 索引名 (列名));

例:
create table test(
id int(10) not null,
name varchar(20) not null,
index id_index (id));

show keys from test\G;

Inserte la descripción de la imagen aquí

2. Índice único

  • Similar a un índice normal, pero la diferencia es que cada valor de la columna de índice único es único. El índice único permite valores nulos (tenga en cuenta que es diferente de la clave principal). Si se crea con un índice compuesto, la combinación de valores de columna debe ser única. Agregar una clave única creará automáticamente un índice único.

2.1 Crea un índice único directamente

CREATE UNIQUE INDEX 索引名 ON 表名(列名);

例:
create unique index address_index on class(address);
create unique index id_index on class(id);

show keys from class\G;

Inserte la descripción de la imagen aquí

2.2 Modificar la creación de tablas

ALTER TABLE 表名 ADD UNIQUE 索引名 (列名);

例:
alter table class add unique cardid_index (cardid);
show keys from class\G;

Inserte la descripción de la imagen aquí

2.3 Especificar al crear una tabla

CREATE TABLE 表名 (字段1 数据类型,字段2 数据类型[,...],UNIQUE 索引名 (列名));

例:
create table test01(
id int(10) not null,
name varchar(20) not null,
unique id_index (id));

show keys from test01\G;

Inserte la descripción de la imagen aquí

3. Índice de clave principal

  • Es un índice único especial y debe designarse como "CLAVE PRINCIPAL". Una tabla solo puede tener una clave principal y no se permiten valores nulos. Agregar una clave principal creará automáticamente un índice de clave principal.

3.1 Especificar al crear una tabla

CREATE TABLE 表名 ([...],PRIMARY KEY (列名));

例:
create table test02(
id int(10) not null,
name varchar(20) not null,
primary key (id));
或
create table test03(id int(10) not null primary key,name varchar(20) not null);

show keys from test02\G;
show keys from test03\G;

Inserte la descripción de la imagen aquí

3.2 Modificar la creación de la tabla

ALTER TABLE 表名 ADD PRIMARY KEY (列名); 

例:
alter table class add primary key(id);
show keys from class\G;

Inserte la descripción de la imagen aquí

4. Índice combinado (índice de una sola columna e índice de varias columnas)

  • Puede ser un índice creado en una sola columna o un índice creado en varias columnas. Se debe cumplir el principio más a la izquierda. Debido a que las condiciones where de la instrucción select se ejecutan de izquierda a derecha sucesivamente, el orden de los campos utilizados en las condiciones where debe ser coherente con el orden en el índice compuesto cuando se usa la instrucción select para consultar, de lo contrario, el índice no tendrá efecto.
CREATE TABLE 表名 (列名1 数据类型,列名2 数据类型,列名3 数据类型,INDEX 索引名 (列名1,列名2,列名3));

select * from 表名 where 列名1='...' AND 列名2='...' AND 列名3='...';

例:
create table test04(id int(10) not null,
name varchar(20) not null,
sex char(2) not null,
index index_amd (id,name));

show keys from test04\G;

insert into test04 values(1,'zhangsan','男');
select * from test04 where id=1 and name='zhangsan';
select * from test04 where id=1;
select * from test04 where name='zhangsan' and id=1;

Inserte la descripción de la imagen aquí

Inserte la descripción de la imagen aquí

5. Índice de texto completo (FULLTEXT)

  • Es adecuado para consultas difusas y se puede utilizar para recuperar información de texto en un artículo.
  • Antes de MySQL 5.6, el índice FULLTEXT solo se puede usar en el motor MyISAM;
  • Después de la versión 5.6, el motor innodb también admite índices FULLTEXT.
  • Se pueden crear índices de texto completo en columnas de tipo CHAR, VARCHAR o TEXT. Solo se permite un índice de texto completo por tabla.

5.1 Crear un índice directamente

CREATE FULLTEXT INDEX 索引名 ON 表名 (列名);

例:
create fulltext index cardid_index on class (cardid);

Inserte la descripción de la imagen aquí

5.2 Modificar la creación de la tabla

ALTER TABLE 表名 ADD FULLTEXT 索引名 (列名);

例:
alter table class add fulltext cardid_index (cardid);

Inserte la descripción de la imagen aquí

5.3 Especificar un índice al crear una tabla

CREATE TABLE 表名 (字段1 数据类型[,...],FULLTEXT 索引名 (列名));
#数据类型可以为 CHAR、VARCHAR 或者 TEXT

例:
create table test05(
id int(10) not null,
name varchar(20) not null,
address varchar(50),
fulltext address_full(address));

insert into test05 values ('1','zhangsan','shanghai');
insert into test05 values ('2','lisi','shanghai');
insert into test05 values ('3','wangwu','nanjing');

Inserte la descripción de la imagen aquí

5.4 Usar consulta de índice de texto completo

SELECT * FROM 表名 WHERE MATCH(列名) AGAINST('查询内容');

例:
select * from test05 where match(address) against('shanghai');

Inserte la descripción de la imagen aquí

(2) Ver el índice

#两个命令查看的信息一样,选其一即可。
show index from 表名;
或者
show keys from 表名;
#---------------查看后个字段的解释----------------------------------------------------
各字段的含义如下:
Table:表的名称。
Non_unique:如果索引不能包括重复词,则为 0;如果可以,则为 1。
Key_name:索引的名称。
Seq_in_index:索引中的列序号,从 1 开始。
Column_name:列名称。
Collation:列以什么方式存储在索引中。在 MySQL 中,有值‘A’(升序)或 NULL(无分类)。
Cardinality:索引中唯一值数目的估计值。
Sub_part:如果列只是被部分地编入索引,则为被编入索引的字符的数目。如果整列被编入索引,则为 NULL。
Packed:指示关键字如何被压缩。如果没有被压缩,则为 NULL。
Null:如果列含有 NULL,则含有 YES。如果没有,则该列含有 NO。
Index_type:用过的索引方法(BTREE, FULLTEXT, HASH, RTREE)。
Comment:备注。

Inserte la descripción de la imagen aquí

Inserte la descripción de la imagen aquí

(3) Eliminar el índice

3.1 Eliminar directamente el índice

DROP INDEX 索引名 ON 表名;
例:
drop index phone_index on class;

Inserte la descripción de la imagen aquí

3.2 Modificar la tabla para eliminar el índice

ALTER TABLE 表名 DROP INDEX 索引名;
例:
alter table class drop index id_index;

Inserte la descripción de la imagen aquí

3.3 Eliminar el índice de la clave principal

ALTER TABLE 表名 DROP PRIMARY KEY;
例:
alter table class drop primary key;

Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/qq_35456705/article/details/113949716
Recomendado
Clasificación