rendimiento de consultas
7.2.3. VELOCIDAD de las Consultas SELECT
En general, cuando se quiere hacer un SELECT lento ... DONDE consulta más rápida, lo primero que debe hacer es comprobar si se puede añadir un índice. Todas las referencias entre las diferentes tablas normalmente se debe hacer con los índices. Usted puede utilizar la sentencia EXPLAIN para determinar los índices que se utilizan para una SELECT. Consulte Sección 7.4.5, "como utiliza MySQL LOS índices" y Sección 7.2.1, "Sintaxis de EXPLAIN (Obtener Información about sin SELECT)".
Algunos consejos generales para acelerar las consultas en tablas MyISAM:
•
Para ayudar a MySQL mejores optimizar las consultas, use ANALYZE TABLE o myisamchk - analizar en una mesa después de que se ha cargado con datos. Esto actualiza un valor para cada parte de índice que indica el número medio de filas que tienen el mismo valor. (Para los índices únicos, esto es siempre 1.) MySQL utiliza para decidir qué índice para elegir cuando se une a dos tablas en función de una expresión no constante. Puede comprobar el resultado del análisis de la tabla usando SHOW INDEX FROM tbl_name y examinar el valor de cardinalidad. myisamchk - description - verbose muestra información sobre la distribución del índice.
•
Para ordenar un índice y datos de acuerdo con un índice, utilice myisamchk - sort-index - sort-records = 1 (si desea ordenar el índice 1). Esta es una buena manera de hacer las consultas más rápidamente si usted tiene un índice único de la que quieres leer todos los registros en orden de acuerdo con el índice. Tenga en cuenta que la primera vez que ordena una gran mesa de esta manera, puede tomar mucho tiempo.
7.2.2. Estimar el renidimiento De Una consulta
En la mayoría de los casos, se puede estimar el rendimiento contando disco busca. Para las tablas pequeñas, generalmente se puede encontrar una fila en un disco seek (porque el índice es probablemente en caché). Para tablas grandes, se puede estimar que, mediante índices B-tree, necesita esta cantidad de busca para encontrar una fila: log (row_count) / log (index_block_length / 3 * 2 / (Index_length + data_pointer_length)) + 1.
En MySQL, un bloque de índice es generalmente 1024 bytes y el puntero de datos suele ser 4 bytes. Para ver una tabla 500000-fila con una longitud de índice de 3 bytes (medio entero), la fórmula indica log (500000) / log (1024/3 * 2 / (3 4)) + 1 = 4 busca.
Este índice requeriría de almacenamiento de alrededor de 500 000 * 7 * 3/2 = 5,2 MB (suponiendo un búfer de índice típico relleno proporción de 2/3), por lo que probable que gran parte del índice en la memoria y por lo tanto necesitan una o dos llamadas a leer los datos para encontrar la fila.
Para las escrituras, sin embargo, necesita cuatro solicitudes de acceso (como arriba) para saber dónde colocar el nuevo índice y, normalmente, de dos pretende actualizar el índice y escribir la fila.
Tenga en cuenta que la discusión anterior no significa que el rendimiento de las aplicaciones degenera lentamente log N. Mientras todo se almacena en caché por el sistema operativo o el servidor MySQL, las cosas son sólo marginalmente más lento que la tabla se hace más grande. Después de los datos es demasiado grande para ser almacenado en caché, las cosas empiezan a ir mucho más lento hasta que las aplicaciones sólo están vinculados por búsquedas en disco (que aumentan en log N). Para evitar esto, aumentar el tamaño de la caché de claves como los datos crece. Para tablas MyISAM, el tamaño de clave de caché se controla mediante la variable de sistema key_buffer_size. Consulte Sección 7.5.2, "afinar Lista de parámetros del Servidor".
Debian / Ubuntu Tips & Tricks nos sugiere dos consejos párr mejorar El Tiempo de Respuesta de MySQL, basado en la ONU Caso proprio.
Muchas veces, un Pesar de Que El Sistema Operativo sí encuentre con Una Carga de Trabajo normal, MySQL Florerias mostrarse algoritmo lento.
Hay Muchas Formas párr mejorar El Tiempo de Respuesta del Servidor MySQL, Aquí nos enfocaremos en dos Formas:
■ Deshabilitar la Resolución de Nombre
■ Modificar el tamano de la caché
La Primera Opción es deshabilitar la Resolución de NOMBRES, de ESTA forma el Servidor no pierde Tiempo Intentando convertir NOMBRES de Dominio a IP. El Unico Inconveniente Sera Que deberas USAR Solamente Direcciones IP párrafo Definir los permisos.
Ademas, Por Una Cuestión de Seguridad No Se Recomienda Nunca USAR NOMBRES de Dominio o nombres de host en la Autenticación de MySQL.
Para deshabilitar la Resolución de NOMBRES de Dominio Debes correr el demonio de MySQL (mysqld) con el Argumento-skip-name-resolve, o bien, en el archivo de configuracion / etc / my.cnf agregar la entrada ¿skip-name-resolve.
[Mysqld]
.....
......
skip-name-resolve
Observa los Resultados del siguiente sencillo de referencia:
■ Con Resolución de NOMBRES, el Servidor sí tarda Entre dos y tres Segundos en responder:
fecha; mysql-u root-h 192.168.1.4, la fecha
Vie Jul 21 23:56:58 CEST 2006
ERROR 1130 (00000): Host .168.1.3 '192 'no tiene permiso para conectarse a este servidor MySQL
Vie Jul 21 23:57:00 CEST 2006
■ Sin Resolución de NOMBRES, el Servidor Responde instantaneamente:
fecha; mysql-u root-h 192.168.1.4, la fecha
Vie Jul 21 23:56:37 CEST 2006
ERROR 1130 (00000): Host .168.1.3 '192 'no tiene permiso para conectarse a este servidor MySQL
Vie Jul 21 23:56:37 CEST 2006
La Segunda pertenezcan Recomendación es Activar la caché de Consultas (chache consulta). La caché de Consultas guarda el Texto de la ONU SELECT junto al Resultado Que FUE Enviado al Cliente. Si despues sí recibe Una consulta identica el Servidor Recupera los Datos de la caché en Vez de ejecutar la consulta NuevaMente.
Para chequear la consulta chache ejecuta:
mysql> SHOW STATUS LIKE 'Qcache%';
Para ver el Estado de la Misma:
mysql> VARIABLES LIKE '% query_cache%' Show;
Para change Tamano de la Misma:
mysql> SET GLOBAL query_cache_size = 52428800;
Para mantener la configuracion de la Misma, heno Que Modificar el archivo / etc / my.cnf:
[Mysqld]
...
...
query_cache_size = 52428800
query_cache_type = 1
7.1.4. El Paquete de Pruebas de RENDIMIENTO (benchmarks) de MySQL
This section deberia Contener Una Descripción Técnica del Paquete de Pruebas de RENDIMIENTO de MySQL (ASI COMO del crash-me), Pero ESA Descripción Aun no ha Sido Escrita. Sin embargo, Florerias hacerse Una buena idea de Como hacer Pruebas de RENDIMIENTO viendo el Código y los Resultados Dentro del Directorio sql-bench en el Código fuente de la Distribución de MySQL.
La finalidad de Este Paquete de Pruebas de RENDIMIENTO es visualizar QUÉ Operaciones sí Realizan bien y Cuales lo Hacen pobremente en Cada Implementación de SQL.
ESTAS Pruebas de RENDIMIENTO ningún hijo múltiples hilo, Asi Que Miden El Tiempo Mínimo párr las Operaciones Realizadas. Se Planea agregar en la ONU Futuro Pruebas múltiples hilo al Paquete.
Para USAR el Paquete, Deben satisfacerse the following requirements:
•
El Paquete de Pruebas de RENDIMIENTO SE proporciona con el Código fuente de la Distribución de MySQL. Also Florerias descargar Distribución Una liberada de http://dev.mysql.com/downloads/, o USAR Nuestro repositorio de Código fuente (ver Sección 2.8.3, "Instalar desde el Árbol de Código fuente de Desarrollo").
•Los guiones de las Pruebas de RENDIMIENTO estan Escritos en Perl y Usan el módulo de Perl DBI to enter a los Servidores de Bases de Datos, Asi Que DBI debe Estar Instalado. Also es Necesario el Controlador DBI especifico párrafo Cada Servidor al Que se QUIERE realizar las Pruebas. Por EJEMPLO, párrafo ProBar MySQL, PostgreSQL y DB2, debe Tener los módulos DBD :: mysql, DBD :: Pg y DBD :: DB2 instalados. Ver Sección 2.13, "Notas Sobre la Instalación de Perl".
Una Vez Retrieved el Código fuente de la Distribución de MySQL, el Paquete de Pruebas de RENDIMIENTO SE encuentra en el Directorio sql-bench. Para ejecutar las Pruebas de RENDIMIENTO, compílese MySQL, váyase al Directorio sql-bench y ejecútese el script de run-all-tests:shell> cd sql-benchshell> perl run-all-tests - server = nombre_servidor
nombre_servidor debe servi Uno De Los Servidores soportados. Para Obtener La Lista Completa de options y Servidores soportados, invóquese el comando:-all-tests de ejecución shell> perl - helpEl script de crash-me also no está SITUADO Dentro del Directorio sql-bench. crash-me intenta Determinar QUÉ Características Soporta Una de base de Datos y Cuales hijo suspensión Capacidades y limitations. Ésto lo consigue ejecutando Consultas
El Mas de factor Importante párrafo HACER UN Sistema Rápido es Do Diseño Básico. Ademas, es necessary CONOCER los Procesos Que cumple el Sistema y Cuales hijo suspensión cuellos de botella. En la Mayoría de los Casos cuellos de botella NACEN de the following FACTORES:
•
Búsqueda en Disco. El disco de NECESITA Cierto Tiempo párr ENCONTRAR UN Paquete de Datos. Con discos Modernos, El Tiempo Medio párr Esto Es usualmente Menor a 10 ms, Asi Que en Teoría sí pueden HACER 100 busquedas porción Segundo. Este Tiempo Mejora Lentamente con los discos nuevos soles y es muy Difícil optimizarlo párr Una sola tabla. La Manera de optimizar El Tiempo de búsqueda es Distribuir los Datos Dentro de Mas de las Naciones Unidas discoteca.
•
Lectura y escritura en la discoteca. De Cuando el disco de sí encuentra en la posicion correcta viene, NECESITAMOS leer los Datos. Los discos Modernos transfieren al Menos 10-20MB / s. Esto Es Mucho Más Fácil de optimizar QUE LAS busquedas, PUESTO QUE PODEMOS Read in Paralelo from múltiplos discotecas.
•
Ciclos de CPU. De Cuando TENEMOS Datos en la memoria principal NECESITAMOS procesarlos párrafo Obtener Resultado algun. Tener los tablas Pequenas es comparacion Con La CANTIDAD De memoria Es El mas Factor Común de limitacion. Pero con tablas Pequeñas, la Rapidez no es usualmente el Problema.
•
Ancho de banda de Memoria. CUANDO EL CPU NECESITA Más Datos de Los Que Florerias Almacenar en la memoria caché de la CPU, el ancho principal de la memoria sí convierte en sin cuello de botella. Es Poco Común en la Mayoría de Casos, Pero debe tenerse en Cuenta.
No hay comentarios:
Publicar un comentario