Artículos avanzados de base de datos MySQL: vista, transacción, índice

Base de datos MySQL avanzada

vista

Para las sentencias SQL de consultas complejas, a menudo se obtienen mediante varias tablas para consultas relacionadas. Si la base de datos se cambia debido a requisitos y otras razones, para garantizar que los datos consultados sean los mismos que antes, es necesario modificarlos en varios lugares, y el mantenimiento es muy problemático, esta vez podemos 定义视图resolverlo.

¿Qué es una vista?

通俗一点来说,'视图' 其实就是一个 'SELECT' 语句的结果集。Entonces, cuando estábamos adentro 使用视图, el trabajo principal era crear esta consulta SQL.

视图的本质是对若干个基本表/引用表的引用,一张虚表(也可以理解为假的表),查询语句执行的结果, De hecho, los datos reales no se almacenan (cuando cambian los datos de la tabla básica / tabla de referencia, el resultado de la ejecución de la consulta de la vista también cambiará).

视图La ventaja es que las operaciones de consulta reducen las declaraciones SQL complejas y mejoran la legibilidad.

Definir la vista

  • Se recomienda que el nombre de la vista comience con 'v_'
create view 视图名称 as select语句;

Ver intento

  • La tabla de vistas también enumerará todas las vistas.
show tables;

Usar vista

  • El propósito de la vista es consultar
select * from v_stu_score;

Eliminar vista

  • soltar vista nombre de vista;
drop view v_stu_sco;

Ver demostración

view01

view02

view03

view04

El papel de la vista

  • Reutilización mejorada, como una función
  • Refactorizar la base de datos sin afectar el funcionamiento del programa
  • Rendimiento de seguridad mejorado, se puede utilizar para diferentes usuarios
  • Aclare los datos

一般大公司有自己的数据库设计规范,比如禁止使用视图之类的情况。

asuntos

¿Qué es una transacción?

La transacción se usa ampliamente en una variedad de escenarios, como el sistema de pedidos, el sistema bancario, etc.

例如:

	A用户和B用户是银行的储户,现在A要给B转账500元,那么需要做以下几件事:

		1、检查A的账户余额>500元;
		2、A 账户中扣除500元;
		3、B 账户中增加500元;

El proceso normal se interrumpió, una cuenta dedujo 500, la cuenta B agregó 500, todos están contentos.

¿Qué pasa si el sistema falla después de que se deduce el dinero de la cuenta A? A perdió 500 en vano, y B no recibió los 500 que deberían haberle pertenecido.

En el caso anterior, se oculta un requisito previo: A deduce dinero y B aumenta el dinero, o tiene éxito al mismo tiempo o fracasa al mismo tiempo. Esta es la necesidad de transacciones.

所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。

Por ejemplo, el trabajo de transferencia bancaria: deducir dinero de una cuenta y agregar dinero a otra cuenta, estas dos operaciones se realizan o no se realizan. Por lo tanto, deben considerarse como un asunto. Una transacción es una unidad de la base de datos para mantener la coherencia de los datos. Al final de cada transacción, se puede mantener la coherencia de los datos.

Cuatro características de la transacción (ACID para abreviar)

  • Atomicidad
  • Consistencia
  • Aislamiento
  • Durabilidad

El siguiente contenido es de la tercera edición de "MySQL de alto rendimiento". Comprender el ACID de las transacciones y los cuatro niveles de aislamiento nos ayuda a comprender mejor las operaciones de transacción.

El siguiente es un ejemplo clásico de una aplicación bancaria que explica la necesidad de las transacciones. Suponga que la base de datos de un banco tiene dos tablas: cuenta corriente y ahorros. Ahora, para transferir $ 200 de la cuenta corriente de la usuaria Jane a su cuenta de ahorros, se requieren al menos tres pasos:

Verifique que el saldo de la cuenta corriente sea mayor o igual a $ 200.
Reste $ 200 del saldo de la cuenta corriente.
Agregue 200 dólares al saldo de la cuenta de ahorros.

上述三个步骤的操作必须打包在一个事务中,任何一个步骤失败,则必须回滚所有的步骤。

Puede iniciar una transacción con la instrucción START TRANSACTION y luego usar COMMIT para confirmar los datos modificados para que persistan, o usar ROLLBACK para deshacer todas las modificaciones. El ejemplo de transacción SQL es el siguiente:

1、start transaction;
2、select balance from checking where customer_id = 10233276;
3、update checking set balance = balance - 200.00 where customer_id = 10233276;
4、update savings set balance = balance + 200.00 where customer_id = 10233276;
5、commit;

Un buen sistema de procesamiento de transacciones debe tener estas características estándar

  • Atomicidad

Una transacción debe considerarse como una unidad de trabajo mínima indivisible. Todas las operaciones de la transacción completa se envían correctamente o todas fallan y se revierten. Para una transacción, es imposible realizar solo una parte de las operaciones. Esta es la transacción Atomicidad

  • Consistencia

La base de datos siempre pasa de un estado coherente a otro estado coherente. (En el ejemplo anterior, se garantiza la coherencia. Incluso si el sistema falla entre la ejecución del tercer y cuarto estado de cuenta, no habrá pérdida de $ 200 en la cuenta corriente, porque la transacción no se compromete finalmente, por lo que los cambios realizados en la transacción tampoco se guardará en la base de datos).

  • Aislamiento

En términos generales, los cambios realizados por una empresa no son visibles para otras transacciones hasta que finalmente se envían. (En el ejemplo anterior, cuando se ejecuta el tercer estado de cuenta y el cuarto estado de cuenta aún no ha comenzado, otro programa de resumen de cuenta se está ejecutando en este momento y ve que el saldo de la cuenta corriente no se ha restado en 200 dólares estadounidenses. )

  • Durabilidad

Una vez confirmada la transacción, los cambios realizados se guardarán permanentemente en la base de datos. (En este momento, incluso si el sistema falla, los datos modificados no se perderán).

Orden de transacción

  • El tipo de motor de la tabla debe ser de tipo innodb para usar transacciones, que es el motor predeterminado para tablas mysql.

Ver la declaración de creación de la tabla, puede ver engine = innodb

-- 选择数据库
use jing_dong;
-- 查看goods表
show create table goods;

Para abrir la transacción, el comando es el siguiente:

  • Ejecute el comando de modificación después de abrir la transacción, los cambios se mantendrán en la caché local, pero no en la tabla física.
begin;
或者
start transaction;

Confirme la transacción, el comando es el siguiente

  • Mantener los cambios de datos en la caché a la tabla física.
commit;

Para revertir la transacción, el comando es el siguiente:

  • Descartar los datos modificados en la caché
rollback;

Nota

  • El comando para modificar los datos activará automáticamente la transacción, incluida la inserción, actualización y eliminación
  • La razón para abrir manualmente la transacción en la declaración SQL es: puede modificar los datos varias veces, si se logran juntos, pasarán juntos a los datos anteriores.

índice

La relación de lectura y escritura del sistema de aplicación general a la base de datos es de aproximadamente 10: 1 (es decir, hay 1 operación de escritura cuando hay 10 operaciones de consulta), y las operaciones de inserción y actualización rara vez tienen problemas de rendimiento, y encuentran la mayoría El problema sigue siendo algunas operaciones de consulta complejas, por lo que la optimización de la declaración de consulta es obviamente la máxima prioridad.

Cuando la cantidad de datos en la base de datos es muy grande, será muy lento encontrar los datos, esta vez se utilizarán优化解决方案:索引。

¿Qué es un índice?

Los índices son un tipo especial de archivo (el índice en la tabla de datos InnoDB es una parte integral del espacio de tabla), contienen punteros de referencia a todos los registros en la tabla de datos.

En términos más generales, el índice de la base de datos es como una tabla de contenido frente a un libro, lo que puede acelerar la velocidad de consulta de la base de datos.

El propósito del índice

El propósito de la indexación es mejorar la eficiencia de las consultas. Se puede comparar con un diccionario. Si queremos buscar la palabra "mysql", debemos ubicar la letra m, luego buscar la letra y en la parte inferior y luego buscar la resto del sql. Si no hay un índice, es posible que deba buscar en todas las palabras para encontrar lo que desea. ¿Qué pasa si quiero encontrar la palabra que comienza con m? ¿O las palabras que comienzan con ze? ¿Crees que esto no se puede hacer sin indexar?

Principio de índice

Además de los diccionarios, se pueden encontrar ejemplos de índices en todas partes de la vida, como los horarios de los trenes en las estaciones de tren y los catálogos de libros. Su principio es el mismo. Al reducir constantemente el rango de datos que desea obtener, puede filtrar el resultado final deseado, mientras convierte eventos aleatorios en eventos secuenciales, es decir, siempre usamos el mismo método de búsqueda para bloquear datos.

La base de datos es la misma, pero obviamente es mucho más complicada, porque no solo se enfrenta a consultas equivalentes, sino también a consultas de rango (>, <, entre, en), consultas difusas (como), consultas de unión (o), y así. ¿Qué forma debería elegir la base de datos para abordar todos los problemas? Pensemos en el ejemplo del diccionario. ¿Podemos dividir los datos en segmentos y luego consultarlos en segmentos? La más simple es si 1000 piezas de datos, 1 a 100 se dividen en el primer párrafo, 101 a 200 se dividen en el segundo párrafo y 201 a 300 se dividen en el tercer párrafo ... De esta manera, para verificar la 250º dato, solo necesitas encontrar el tercer párrafo. Se eliminó el 90% de los datos no válidos.

suoyin01

Uso de índice

  • Ver índice
show index from 表名;
  • Crear índice
    • Si el campo especificado es una cadena, se debe especificar la longitud y se recomienda que sea la misma que la longitud cuando se definió el campo.
    • Si el tipo de campo no es una cadena, no es necesario que complete la parte de longitud
create index 索引名称 on 表名(字段名称(长度))
  • Eliminar índice
drop index 索引名称 on 表名;

Demostración del índice

Crear tabla de prueba testindex

create table test_index(title varchar(10));

Use el programa python (ipython también es posible) para agregar cien mil datos a la tabla a través del módulo pymsql

from pymysql import connect

def main():
    # 创建Connection连接
    conn = connect(host='localhost',port=3306,database='jing_dong',user='root',password='mysql',charset='utf8')
    # 获得Cursor对象
    cursor = conn.cursor()
    # 插入10万次数据
    for i in range(100000):
        cursor.execute("insert into test_index values('ha-%d')" % i)
    # 提交数据
    conn.commit()

if __name__ == "__main__":
    main()

Preguntar

  • Active la supervisión del tiempo de ejecución:
set profiling=1;
  • Encuentre el dato número 10,000 ha-99999
select * from test_index where title='ha-99999';
  • Ver el tiempo de ejecución:
show profiles;
  • Cree un índice para la columna de título de la tabla title_index:
create index title_index on test_index(title(10));
  • Ejecute la declaración de consulta:
select * from test_index where title='ha-99999';
  • Verifique el tiempo de ejecución nuevamente
show profiles;

Nota:

要注意的是,建立太多的索引将会影响更新和插入的速度,因为它需要同样更新每个索引文件。对于一个
经常需要更新和插入的表格,就没有必要为一个很少使用的where字句单独建立索引了,对于比较小的表,
排序的开销不会很大,也没有必要建立另外的索引。

建立索引会占用磁盘空间

Supongo que te gusta

Origin blog.csdn.net/weixin_42250835/article/details/90694483
Recomendado
Clasificación