La Red de Conocimientos Pedagógicos - Currículum vitae - ¿Cuál es mejor, la partición o la tabla mysql?

¿Cuál es mejor, la partición o la tabla mysql?

Particiones y tablas MySQL.

1. ¿Qué son las subtablas y particiones de MySQL?

¿Qué son las subtablas? En la superficie, una tabla se divide en más de N subtablas. Para obtener más información, consulte los tres métodos de las subtablas de MySQL.

¿Qué es una partición? Particionar consiste en dividir los datos de una tabla en N bloques, que pueden estar en el mismo disco o en discos diferentes.

Antes que nada, hablemos de por qué necesitamos dividir la mesa.

Cuando un dato llega a millones, te llevará más tiempo consultarlo una vez. Si hay una consulta conjunta, creo que podría morir ahí. El propósito de la división de tablas es reducir la carga de la base de datos y acortar el tiempo de consulta.

Según la experiencia personal, el proceso de ejecución de un sql por parte de mysql es el siguiente:

1. Recibir el sql 2. Poner el sql en la cola 3. Ejecutar el sql4; . Devuelve el resultado de la ejecución. ¿Dónde pasó más tiempo durante esta implementación? Primero, el tiempo de espera de la cola y segundo, el tiempo de ejecución de SQL. De hecho, estos dos son lo mismo. Mientras espera, sql debe estar ejecutándose. Entonces necesitamos acortar el tiempo de ejecución de SQL.

Existe un mecanismo en mysql que son los bloqueos de tabla y los bloqueos de fila. ¿Por qué aparece este mecanismo? Esto es para garantizar la integridad de los datos. Déjame darte un ejemplo. ¿Qué debo hacer si dos SQL quieren modificar los mismos datos en la misma tabla? ¿Pueden dos SQL modificar estos datos al mismo tiempo? Obviamente, MySQL maneja esta situación de la siguiente manera: uno es un bloqueo de tabla (motor de almacenamiento myisam) y el otro es un bloqueo de fila (motor de almacenamiento innodb). El bloqueo de la mesa significa que ninguno de ustedes puede operar esta mesa y deben esperar a que yo termine de operarla. Lo mismo ocurre con el bloqueo de filas. Otro SQL debe esperar a que complete la operación con estos datos antes de poder operar con estos datos. Si hay demasiados datos, el tiempo de ejecución será demasiado largo y el tiempo de espera será mayor, por lo que necesitamos particionar la tabla.

2. Dividir tablas

1. Cree un clúster mysql, como: use clúster mysql, agente mysql, replicación mysql, drdb, etc.

Algunas personas pueden preguntar al clúster mysql, ¿qué tiene que ver la tabla raíz con él? Aunque no es una subtabla en el sentido real, desempeña el papel de una subtabla. ¿Qué significa ser un clúster? Reducir la carga de una base de datos, para decirlo sin rodeos, significa reducir la cantidad de SQL en la cola SQL. Por ejemplo, hay 10 solicitudes SQL. Si los pone en la cola del servidor de la base de datos, tendrán que esperar mucho tiempo. Si estas 10 solicitudes SQL se distribuyen entre las colas de cinco servidores de bases de datos, entonces solo habrá dos en la cola de un servidor de bases de datos. ¿Esto reduce significativamente el tiempo de espera? Ya es obvio. Así que lo enumeré en la subtabla. He realizado algunos clústeres de mysql:

Instalación, configuración y separación de lectura y escritura del agente mysql de Linux

Instalación y configuración de la replicación de mysql, y sincronización de datos.

Ventajas: Buena escalabilidad, sin operaciones complejas (código php) después de la partición de varias tablas.

Desventajas: la cantidad de datos en una sola tabla no ha cambiado, una operación todavía lleva la misma cantidad de tiempo y la sobrecarga de hardware es alta.

2. Realice estimaciones preliminares para tablas con gran cantidad de datos y acceso frecuente, y divídalas en varias tablas.

Esta estimación no está mal. La lista de publicaciones publicadas en el foro será muy grande con el tiempo, posiblemente cientos de miles o millones. La tabla de información en la sala de chat requiere mucho tiempo para que decenas de personas charlen juntas toda la noche. Los datos de esta tabla deben ser muy grandes. Hay muchas más situaciones como esta. Por lo tanto, para este tipo de tabla de big data predecible, la dividiremos en n tablas de antemano. Lo que sea n depende de la situación real. Tome la tabla de información del chat como ejemplo:

Construí 100 tablas de este tipo por adelantado, mensaje_00, mensaje_01, mensaje_02.........mensaje_98, mensaje _99. Luego, según la identificación del usuario, podemos determinar en qué tabla se coloca la información de chat del usuario. Se puede obtener mediante hash o resto. Hay muchas maneras, piénsalo.

Lo siguiente utiliza el método hash para obtener el nombre de la tabla:

¿Ver copia impresa?

<? Lenguaje de programación del lado del servidor (abreviatura de Preprocesador de hipertexto profesional)

Función get_hash_table($table, $userid) {

$ str = crc32($ userid);

if($str <0){

$hash = "0". substr(abs($str), 0, 1);

} En caso contrario {

$hash = substr($str, 0, 2); }

Devuelve $tabla. "_".$ hash

}

echo get_hash_table('message ', 'user 18991 '); //El resultado es message_10.

echo get_hash_table('message','user 34523'); //El resultado es message_13.

& gt

El método anterior nos dice que el mensaje del usuario18991 se registra en la tabla message_10 y el mensaje del usuario34523 se registra en la tabla message_13. Al leer, simplemente lea las tablas respectivas.

Ventajas: Evita millones de datos en la tabla y acorta el tiempo de ejecución de SQL.

Desventajas: Una vez establecida una regla, puede resultar problemático romperla. En el ejemplo anterior, el algoritmo hash que utilicé es crc32. Si no quiero utilizar este algoritmo ahora, después de cambiar a md5, los mensajes del mismo usuario se almacenarán en tablas diferentes y los datos se confundirán. La escalabilidad es muy pobre.

3. Utilice el motor de almacenamiento combinado para lograr la división de tablas.

Creo que este método es más adecuado para aquellos que no lo han pensado de antemano, pero ya viven bien y la consulta de datos es lenta. En este momento, es doloroso dividir la gran tabla de datos existente. Lo más doloroso es cambiar el código, porque las declaraciones SQL en el programa ya se han escrito y ahora una tabla debe dividirse en docenas o incluso cientos de ellas. mesas. ¿Necesito reescribir esta declaración SQL? Por ejemplo, me gusta mucho levantar a un niño.

mysql & gt display motor; encontrará que mrg_myisam en realidad está fusionado.

¿Ver una copia para imprimir?

mysql>Si no existe, crea la tabla ` usuario1 `(

-& gt; ` id ' int(11)NOT NULL AUTO _ INCREMENT,

->` name ' varchar(50) por defecto es NULL,

->`sex` int(1) NOT NULL por defecto es '0',

-& gt; Clave principal (` id `)

-& gt;)ENGINE=MyISAM default CHARSET = utf8 AUTO_INCREMENT = 1;

La consulta es normal, 0 filas están afectadas (0,05 segundos)

mysql >Crear tabla "usuario2" si no existe (

->` id ' int(11)NOT NULL AUTO_INCREMENT,

-& gt ;` nombre ' varchar(50) por defecto es NULL,

-& gt;`sex` int(1) NOT NULL por defecto es '0',

-& gt; key (` id `)

-& gt;)ENGINE=MyISAM default CHARSET = utf8 AUTO _ INCREMENT = 1

La consulta es normal, 0 filas afectadas (0,01 segundos)

mysql & gt insertado en `usuario1` (`nombre`, `sexo `) valor ('Zhang Ying', 0

Consulta correcta, 1 fila afectada (0,00 segundos);

mysql & gt insert 'user2` (`name`, `sex `) value (' tank ', 1

Consulta OK, 1 fila afectada (0,00 segundos)

mysql>Crear tabla ` alluser `(

-& gt;` id ' int(11)NO si no existe NULL AUTO _ INCREMENT,

-> ; ` nombre ' varchar(50) por defecto es NULL,

->`sex` int(1) NOT NULL por defecto es ' 0',

->INDEX (id )

->)TYPE=MERGE UNION=(usuario1,usuario 2)INSERT_METHOD=LAST AUTO_INCREMENT= 1;

La consulta es normal, 0 filas están afectadas, 1 advertencia ( 0,00 segundos)

mysql y gt seleccionan ID, nombre y sexo de todos los usuarios.

+ - + - + - +

DNI|Nombre|Sexo|

+ - + - + - +

| 1 |Zhang Ying| 0

| 1 |Tanque| 1 |Tanque

+ - + - + - +

2 filas en el conjunto (0,00 segundos) )

mysql & gt insertado en ` alluser` (`name`, `sex `) value (' tank2 ', 0

La consulta es normal, 1 fila está afectada; (0.00 segundos)

mysql & gtSeleccione id, nombre, género del usuario 2

-& gt;;

+ - + - + - +< / p>

DNI|Nombre|Sexo|

+ - + - + - +

| 1 |Tanque| |Tanque 2 |

+ - + - + - +