Servidor MYSQL uso de la CPU es una solución demasiado alta

  
                  El host de mi amigo (Windows 2003 + IIS + PHP + MYSQL) Recientemente, el proceso de servicio MySQL (mysqld-nt.exe) tiene un uso de CPU del 100%. Este host tiene aproximadamente 10 bases de datos, que se llaman para diez sitios web. De acuerdo con una prueba de amigos, el cpu mysqld-nt.exe ocupa un alto grado de sitio web A. Una vez que el sitio web se detiene en IIS, se reduce el uso de la CPU. Una vez habilitado, se incrementa de inmediato. El MYSQLCPU toma el 100% del proceso de resolución. Lo verifiqué cuidadosamente esta mañana. En la actualidad, el IP promedio diario de este sitio web es de 2000 y el PageView es de aproximadamente 30,000. La base de datos utilizada por el sitio web A actualmente tiene 39 tablas, con un número de registro de 601,000, que ocupan 45MB. MySQL no puede ocupar un recurso tan alto. Ejecute el comando en el servidor y envíe la variable de entorno mysql actual al archivo output.txt: d: \\ web \\ mysql > mysqld.exe - help > output.txt y encuentre tmp_table_size El valor es el predeterminado 32M, así que modifique My.ini, asigne tmp_table_size a 200M: d: \\ web \\ mysql > notepad c: \\ windows \\ my.ini [mysqld] tmp_table_size = 200M y reinicie el servicio MySQL. El uso de la CPU tiene una ligera caída , la CPU anterior ocupó la ola La gráfica es 100% recta y ahora fluctúa entre 97% y 100%. Esto muestra que ajustar el parámetro tmp_table_size mejora el rendimiento de MYSQL. Pero el problema no se ha resuelto completamente. Por lo tanto, ingrese la línea de comandos del shell mysql. Lista de procesos, ver la instrucción sql actual utilizada frecuentemente por mysql: mysql> showprocesslist; llamar repetidamente a este comando (dos veces por segundo), encontró que dos declaraciones SQL del sitio web A aparecen a menudo en la lista de procesos, la sintaxis es la siguiente: SELECCIONE t1.pid , t2.userid, t3.count, t1.dateFROM _mydata COMO t1LEFT JOIN _myuser COMO t3 ON t1.userid = t3.useridLEFT JOIN _mydata_body AS t2 ON t1.pid = t3.pidORDER BY t1.pidLIMIT 0,15 control de columnas mostrar show call La estructura de estas tres tablas: mysql> showcolumns de _myuser; mysql > showcolumns de _mydata; mysql > showcolumns de _mydata_body; finalmente encontró el problema: _mydata table, solo se establece una clave principal de acuerdo con el usuario, pero no se crea ningún índice para userid Y en la primera cláusula LEFT JOIN ON de esta declaración SQL: LEFT JOIN _myuser AS t3 ON t1.userid = t3.userid_mydata userid es Comparado con la operación de comparación condicional, creé un índice para la tabla _mydata basado en el campo userid: mysql> ALTERTABLE `_mydata` ADD INDEX (` userid`) Después de crear este índice, la CPU cayó inmediatamente a aproximadamente el 80%. El problema es que, por lo tanto, verifique otra instrucción SQL que aparezca repetidamente en la lista de procesos de la presentación: SELECCIONE CUENTA (*) FROM _mydata AS t1, _mydata_key AS t2WHERE t1.pid = t2.pid y t2.keywords = 'Peacock' check_mydata_key La estructura de la tabla encontró que solo construyó una clave principal para pid, no index._mydata_key para las palabras clave. Actualmente hay 330,000 registros y no hay un índice para realizar una comparación de recuperación de texto en 330,000 registros, sin gastar una gran cantidad de CPU. El tiempo es extraño. Parece que la búsqueda de esta tabla es un problema. Así como la tabla _mydata_key según las palabras clave del campo más el índice: mysql> ALTERTABLE `_mydata_key` AÑADIR ÍNDICE (` keywords ') después del establecimiento de este índice, la CPU cae inmediatamente Abajo, oscile entre el 50% y el 70%. Llame a show prosslist de nuevo, la llamada sql del sitio web R rara vez aparece en la lista de resultados. Pero se encontró que este host se está ejecutando Varios programas del foro de Discuz, varios de los foros de Discuz también tienen este problema. Por lo tanto, se resuelven juntos, se reduce el uso de la CPU. Resuelva la ocupación MYSQLCPU del 100% de la experiencia para aumentar el valor de tmp_table_size. Archivo de configuración mysql, El tamaño predeterminado de tmp_table_size es 32 M. Si una tabla temporal excede este tamaño, MySQL genera un error de la forma tbl_name está lleno. Si realiza muchas consultas avanzadas de GROUP BY, aumente el valor de tmp_table_size. Esta es la explicación oficial de mysql para esta opción: Intente evitar las tablas temporales optimizando las consultas cuando sea posible, pero cuando esto no sea posible, intente asegurarse de que las tablas temporales estén siempre Almacenado en la memoria. Observar la lista de procesos para consultas con tablas temporales que demoran demasiado tiempo toresolve puede advertirle de que es necesario aumentar tmp_table_size. Tenga en cuenta que la memoria también se asigna por subproceso. Mple donde esta versión funcionó por más fue un servidor donde se acumuló esto de 32 MB (el valor predeterminado) a 64 MB con efecto inmediato. La resolución más rápida de las consultas dio como resultado menos bytes activos al mismo tiempo, con beneficios completos para el servidor, y disponibles Memoria. Los campos utilizados en los juicios condicionales en las cláusulas WHERE, JOIN, MAX (), MIN (), ORDER BY deben indexarse ​​de acuerdo con su ÍNDICE de índice. El índice se utiliza para encontrar rápidamente una columna en una columna. Filas con valores específicos. Sin un índice, MySQL debe comenzar con el primer registro y luego leer toda la tabla hasta que encuentre la fila correspondiente. Cuanto más grande sea la tabla, más tiempo tomará. Si la tabla tiene un índice en la columna de la consulta MySQL puede llegar rápidamente a una ubicación para buscar la mitad de un archivo de datos. No hay necesidad de considerar todos los datos. Si una tabla tiene 1000 filas, esto es al menos 100 veces más rápido que las lecturas secuenciales. Todos los índices de MySQL (PRIMARIO, ÚNICO e ÍNDICE) están en Se almacena en el árbol B. De acuerdo con la documentación de desarrollo de mysql: el índice se usa para: buscar rápidamente la fila que coincide con una cláusula WHERE. Al realizar una unión (JOIN), recuperar filas de otras tablas. La columna de índice encuentra el valor MAX () o MIN () si la clasificación o agrupación se realiza en el prefijo más a la izquierda de una clave disponible (por ejemplo, ORDER BYkey_part_1, key_part_2), clasificando o agrupando una tabla. Si todas las partes clave-valor siguen DESC, Las claves se leen en orden inverso. En algunos casos, una consulta se puede optimizar para recuperar valores sin consultar el archivo de datos. Si todas las columnas utilizadas para algunas tablas son numéricas y forman el prefijo más a la izquierda de algunas claves, Para que sea más rápido, el valor se puede recuperar del árbol de índice. Suponga que emite la siguiente instrucción SELECT: mysql > SELECT * FROM tbl_name DONDE col1 = val1 AND col2 = val2; si existe un índice de varias columnas en col1 y col2, la línea correspondiente Puede obtenerse directamente. Si existen índices de columna de una sola fila separados en col1 y col2, el optimizador intenta encontrar un índice más restrictivo y decide utilizar el índice para buscar filas al decidir qué índice encontrará menos filas. Al diseñar tablas de datos SQL, asegúrese de considerarlas todas.
Copyright © Conocimiento de Windows All Rights Reserved