Me estoy volviendo loco. ¿Cómo uso subprocesos múltiples para escribir datos en una base de datos MYSQL?
MySQL select * from t 1 order by rand();
Operación multiproceso, la CPU está llena y otras solicitudes solo se pueden bloquear. ¿Qué hacer en esta situación? ?
Probablemente existan las siguientes soluciones:
Establezca max_execution_time para evitar la lectura de SQL durante demasiado tiempo. El posible problema es que se eliminará todo SQL KILL largo. Algunos que tendrán que ser ejecutados durante mucho tiempo también morirán por error.
Escriba un script para detectar este tipo de declaraciones, como order by rand(), y utilice Kill query thread_id para eliminarlo después de un cierto período de tiempo.
¿Puede ejecutarse normalmente sin matarlo pero sin afectar otras solicitudes?
Entonces, el grupo de recursos (abreviado como micro RG) introducido en mysql 8.0 básicamente puede resolver este tipo de problemas.
Por ejemplo, puedo usar RG para limitarlo a un núcleo de CPU específico en el nivel SQL, lo ignoraré y dejaré que continúe ejecutándose. Si hay una nueva declaración similar, póngala en línea.
¿Por qué decimos básico? Actualmente, solo se pueden vincular recursos de CPU y no hay nada más disponible por el momento.
Déjame decirte cómo utilizar RG.
Crear un grupo de recursos user_ytt. El significado de cada parámetro se explica aquí.
Tipo = usuario indica que se trata de un hilo en modo de usuario, es decir, el hilo de solicitud en primer plano. Si tipo = sistema, significa subproceso en segundo plano, utilizado para limitar los subprocesos propios de MySQL, como el subproceso InnoDB Purge, el subproceso InnoDB Read, etc.
Vcpu indica el número de núcleos lógicos de la CPU, donde 0-1 indica que los dos primeros núcleos están vinculados a este RG. Puedes usar lscpu, top, etc. Enumere su propia información relacionada con la CPU.
Thread_priority establece la prioridad. La configuración de prioridad a nivel de usuario es mayor que 0.
mysqlmysql & gtCrear grupo de recursos user_ytt tipo = usuario? vcpu = 0-1 thread_priority = 19 habilitado; consulta normal, 0 filas afectadas (0,03 segundos)
La información relacionada con RG se puede recuperar desde information_schema. Tabla del sistema de grupos de recursos.
mysqlmysql & gtselect * de información _ esquema _ grupos de recursos +--+-+-+-+|nombre del grupo de recursos|tipo de grupo de recursos|habilitación del grupo de recursos|identificación de VCPU|prioridad de subprocesos| -+-+-+-+| USR predeterminado|usuario|? 1 | 0-3 ?| ?0 || SYS_predeterminado | | ?1 | 0-3 ?| ?0 || usuario_ytt |? 1 | 0-1 ?| ?19 |+ - + - + - + 3 filas en el conjunto (0,00 segundos)
Demos la declaración select guid from t 1 group by left(guid, 8 ) ordenar por rand () RG user_ytt.
mysql>Mostrar lista de procesos; + - + - + - + - + - + - + - +| |Usuario|¿Anfitrión? |bd? |Comando|¿Tiempo? |¿Estado? |¿Información? |+ - + - + - + - + - + - + - + - +| ?4 | programador_de_eventos | | 10179 | Esperando cola vacía | || 240 | raíz | localhost | |Consulta? | 101 | Crear índice de clasificación | seleccione grupo guid desde t1 por orden izquierdo (guid) por rand() | |Consulta? | 0 | ¿Iniciar? |¿Mostrar lista de procesos? |+ - + - + - + - + - + - + 3 filas en la colección (0.00 segundos)
Encuentre el thread_id correspondiente a la conexión 240.
mysqlmysql y gtselect thread_id de performance_schema donde Processlist_id = 24 - +| thread_id |+ - +|? 278 |++65438+0 filas en la colección (0,00 segundos)
Dale a este hilo 278 RG user_ytt. Tiene éxito sin informar un error.
mysqlmysql & gt establece el grupo de recursos user_ytt en 278, la consulta es normal, 0 filas se ven afectadas (0,00 segundos)
Por supuesto, esto se hace a nivel de operación y mantenimiento; , También podemos En el nivel de desarrollo, combinado con indicaciones de MYSQL, el término RG se proporciona por separado. Por ejemplo:
mysqlmysql & gtselect/*+resource_group(user_ytt)*/guid from t 1 group by left(guid, 8) order by rand().... 8388602 en la colección Line (4 minutos y 46,09 segundos)
Limitaciones de RG:
La función CAPSYSNICE debe estar activada en la plataforma Linux. Por ejemplo, uso systemd para agregar el servicio mysql en mi máquina.
sistema CTL editar MySQL @ 80[Servicio]capacidades ambientales = CAP _ SYS _ NICE
RG falló después de que se abrió el grupo de subprocesos de MySQL.
Para FreeBSD en la plataforma Solaris, thread_priority no es válido.
Actualmente, solo se puede vincular la CPU y no se pueden vincular otros recursos.