www.state-it.info

Gran base de respuestas a las preguntas de los desarrolladores
Header decor

¿cómo de alguna manera conocer cuáles son las consultas a qué tabla se producían a lo largo de la aplicación web? Y la cantidad de tiempo que ocupaban?

sorry_i_noob 2018-11-07 00:18:47

hola! Leo un artículo en la habré Optimización de MySQL. Allí se dice:

Selección de índices debe comenzar con un análisis de todas las solicitudes a esta tabla. Muy a menudo, después de este análisis, en lugar de tres-cuatro índices se puede hacer de un compuesto.

¿Es necesario en el código de la aplicación para buscar todas las solicitudes a una tabla en particular y analizar? Se puede hacer algo en MySQL es llevar? Las solicitudes se a qué tabla y la cantidad de tiempo que ocupaban? Comparar estas solicitudes - ¿qué más, qué menos. Qué ocupaban mucho ms, qué poco. Se puede así?

Total answers: 4

Rsa97 2018-11-07 01:21:02

Normalmente comienzan con el análisis de habilitar el registro de consultas lentas (slow query log). Allí se registran todas las solicitudes que se analizan más de un número especificado de filas y ocupan más de tiempo especificado.
Si esto no es suficiente, se puede activar el registro de consultas (general query log). Ahí ya entran todas las consultas y la información sobre la conexión/desconexión de los clientes.

sorry_i_noob 2018-11-07 11:26:56

Y si la base de datos hasta que no especialmente está llena? No analizar? Es necesario esperar a que se llene y luego colocar los índices?


Rsa97 2018-11-07 11:36:01

sorry_i_noob, La optimización es uno de los errores de desarrollo. Optimizar es necesario cuando ya son claros los cuellos de botella.


sorry_i_noob 2018-11-07 11:41:50

Rsa97, es decir, hasta que la base de datos no está completa, acerca de los índices en general a pensar que no es necesario?


Rsa97 2018-11-07 11:49:13

sorry_i_noob, Bueno, ¿por qué, primaria, los únicos índices y claves externas de componer todos modos. Y aquí está el resto, en mi humilde opinión, es mejor primero realizar el análisis. Por ejemplo, si en la tabla de datos se agregan a cada segundo, y se solicitan vez al día, por lo que sobran los índices serán interferir.


ThunderCat 2018-11-07 11:51:43

sorry_i_noob,

es decir, hasta que la base de datos no está completa, acerca de los índices en general a pensar que no es necesario?
No se debe confundir necesarios evidentes los pasos con la optimización. Todos los campos explícitos en las condiciones de la muestra como se comparan deben ser calificados. Otra cosa es que en diferentes cantidades de registros en la base de seleccionar diferentes métodos de selección/combinación de las tablas, entonces necesitará(es posible). la optimización de las consultas, mientras tanto, no tiene sentido pensar en este problema.


sorry_i_noob 2018-11-07 12:14:47

Rsa97, se dio cuenta, gracias. Hay una pregunta acerca de los "índices de claves externas"...
Digamos que hay de la tabla: "Etiquetas", "Publicación" y "Публикации_Теги" (es la relación muchos-a-muchos para los dos primeros de la tabla). El último de la tabla hay barras "ид_тега", "ид_публикации". A ellos hay que poner a los índices? Ya que esto claves externas, sí? El tipo de índice es normal INDEX. Correctamente entiendo?


Rsa97 2018-11-07 12:19:13

sorry_i_noob, el Principal índice de la tabla debe ser integrado ("ид_тега", "ид_публикации"). Entonces la clave externa a la tabla de etiquetas de índice ya se (el comienzo de un índice compuesto), y a la tabla de publicaciones índice se crea automáticamente al crear una clave externa.


sorry_i_noob 2018-11-07 13:17:41

Rsa97, entonces resulta que en la tabla "Публикации_Теги" no debe ser la columna "id", único que identifica a la cadena? En su lugar hay dos postes - "ид_тега", "ид_публикации"?
Siempre es así se debe hacer en las tablas de la relación? "uno-a-muchos", "muchos-a-muchos", "uno a uno"? No debe ser la columna "id", que identifica a la cadena. En su lugar dos postes - id de filas de las tablas, para los cuales se ha creado es la actitud?


Rsa97 2018-11-07 13:24:27

sorry_i_noob, de Tal manera que tiene sentido es en el cuadro de las relaciones muchos-a-muchos, cuando las parejas deben ser únicos. En la mayoría de los casos, se автоинкрементный id o, por ejemplo, el generado por el guid. Son las variantes, cuando hay que utilizar la natural clave, por ejemplo, el código de dos letras del país.


sorry_i_noob 2018-11-07 14:15:28

Rsa97, muchas gracias, ahora todo está claro. Y no saben todavía. He leído que allí, donde en el WHERE escritos por dos columnas, es necesario hacer un índice compuesto, compuesto de dos columnas. El orden de las columnas en el índice de la misma, como en el WHERE.

Pero si tengo dos WHERE - para las dos columnas. Tengo dos índices de crear (uno en cada columna) o uno? Y si uno, con lo cual el orden de las columnas será? Cuanto más a menudo la consulta, donde se utiliza la cláusula WHERE para una columna en particular, el hecho de первее esta columna en el índice?
Es decir, es necesario otra forma de determinar cuáles son las consultas más y cuáles menos.


Rsa97 2018-11-07 14:28:05

MySQL intenta recoger el índice que comienza, y que va en el mismo orden que las condiciones en la cláusula WHERE. En este caso, si la columna está dentro de la función, el índice de no trabajar.
WHERE `dist` > 100 - se puede utilizar el índice de dist`.
WHERE sqrt(`dist`) > 10 - el índice de utilizar.
WHERE `dist` > 100 AND `type` = 'shop' - se utilizará el índice (`dist`, `type`) o (`dist`), índices (`type`) y (`type`, `dist`) no se utilizará.
Dependiendo de la cantidad de que se analice la solicitud de filas de MySQL intenta optimizar el uso de los índices, por lo que precisa вариани usted necesita mirar en EXPLAIN.


sorry_i_noob 2018-11-07 16:45:58

Rsa97, gracias. Y todavía se puede pregunta...
Si estoy en la tabla de "Etiquetas" para la columna "ИмяТега" puso un índice único. Es un índice normal ya no es necesario? Único incluye?
Consulta:
WHERE ИмяТега = какая-то_строка


Rsa97 2018-11-07 16:58:49

sorry_i_noob, Sí.
Un índice es un índice normal, pero prohíbe dos valores idénticos o un conjunto de valores. Si se NULL, todos ellos se consideran únicos, así como NULL != NULL.
El índice principal es un índice único de principal campo en el que están prohibidas NULL. El índice principal puede ser el único en la tabla.


sorry_i_noob 2018-11-09 00:02:51

Rsa97,

el Principal índice de la tabla debe ser integrado ("ид_тега", "ид_публикации"). Entonces la clave externa a la tabla de etiquetas de índice ya se (el comienzo de un índice compuesto), y a la tabla de publicaciones índice se crea automáticamente al crear una clave externa.

Y ¿importa el orden?
"ид_тега", "ид_публикации" o "ид_публикации", "ид_тега" - ¿hay alguna diferencia? Y si sí, ¿en qué afecta?


Rsa97 2018-11-09 00:15:50

sorry_i_noob, Tiene.
Cualquier índice se utiliza sólo con el primer campo y en orden.
Es decir, el índice (`ид_тега`, `ид_публикации`) se usa en expresiones

WHERE `tag_id` = :tag AND `pub_id` = :publication
WHERE `tag_id` = :tag

Pero no será en la expresión de
WHERE `pub_id` = :publication

Qué pasa con la expresión
WHERE `pub_id` = :publication AND `tag_id` = :tagno estoy seguro, es necesario mirar EXPLAIN.


landergate 2018-11-07 01:33:45

  1. En el my.cnf:
    performance_schema=1
  2. Reiniciar el MySQL.
  3. Importar sys_xx.sql de un proyecto de mysql-sys: https://github.com/mysql/mysql-sys
  4. Esperar un poco de tiempo, hasta reunir las estadísticas con el último lanzamiento de base de datos.
  5. Analizar las solicitudes en la tabla `sys`.`statement_analysis`.

heahoh 2018-11-07 14:27:34

Encima de la capa intermedia del controlador a su base de datos usted puede escribir el envoltorio y en lugar de llamar, por ejemplo, PDO::query llamar PDOExtend::query con el relleno de la vista:

class PDOExtend extends PDO
{
    /** @var \Psr\Log\LoggerInterface */
    protected $logger;

    public function __construct(string $dsn, string $username, string $passwd, array $options, \Psr\Log\LoggerInterface $logger)
    {
        parent::__construct($dsn, $username, $passwd, $options);
        $this->logger = $logger;
    }

    public function query(string $preparedQuery): PDOStatement
    {
        $queryStart = microtime(true);
        $result = parent::query($preparedQuery);
        $queryStop = microtime(true);

        $this->logger->debug(sprintf('%s query executed %s', static::class, $preparedQuery), [
            'query_start_time'      => $queryStart,
            'query_finish_time'     => $queryStop,
            'elapsed'               => $queryStop - $queryStart
        ]);
        
        return $result;
    }
}

Protos 2018-11-07 14:43:53

garda de base de datos

Preguntas relacionadas:

Footer decor

© www.state-it.info | Base of answers to questions for developers and programmers.