¿Cuál es el significado de filtrado en MySQL explicar?


21

Como se describe aquí en los documentos de MySQL :

La columna filtrada indica un porcentaje estimado de filas de la tabla que serán filtradas por la condición de la tabla. Es decir, las filas muestran el número estimado de filas examinadas y las filas × filtradas / 100 muestran el número de filas que se unirán a las tablas anteriores. Antes de MySQL 5.7.3, esta columna se muestra si usa EXPLAIN EXTENDED. A partir de MySQL 5.7.3, la salida extendida está habilitada de forma predeterminada y la palabra clave EXTENDED es innecesaria.

Aún no lo entiendo. ¿Cuál es el significado de "filtrado" aquí? ¿Qué información podemos obtener de esta columna?

Por ejemplo, cuando comienzo a consultar, algunas consultas mostrarán 100, y otras mostrarán 18 o menos de 100.

+-------------+-------+--------+---------+---------+------+----------+
| select_type | table | type   | key     | key_len | rows | filtered |
+-------------+-------+--------+---------+---------+------+----------+
| PRIMARY     | a     | range  | search  | 4       |  174 |   18.00  | <--
| PRIMARY     | b     | eq_ref | PRIMARY | 4       |    1 |   100.00 |
| PRIMARY     | c     | ALL    | PRIMARY | 4       |    1 |   100.00 |

¿Cuál es el punto principal que podemos concluir de este valor?

¿Dice que la columna filtró solo el 18%? ¿O si cuanto más bajo es el puntaje, más bueno es el índice / consulta?

Estoy usando MySQL 5.7

Respuestas:


30

Filtrar aquí significa aplicar una condición en un conjunto de filas que fueron seleccionadas por type-search como filas potenciales, y solo mantener las filas que cumplen la condición:

MySQL primero intentará usar un índice, por ejemplo, rangeescanee su tabla ausando la searchtecla. Se estima obtener 174 filas al usar ese índice, que es el número rows. Este paso aún no se llama filtrado.

Después de eso, estas 174 filas deben verificarse con condiciones adicionales (generalmente en su wherecláusula). MySQL ahora estima que solo quedarán 32 filas, por lo que el 18% de estas 174 filas permanecerán después de que se haya aplicado ese filtro. Este 18% es el valor en filtered.

Si bien es obviamente mejor tener 32 filas en lugar de 174 (si, por ejemplo, tiene que más tarde joincon otra tabla), un índice "perfecto" le habría dado estas 32 filas directamente desde la búsqueda inicial, ahorrándole el tiempo para mirar y filtrar el 82% de todas las filas potenciales.

Por lo tanto, un valor bajo podría indicar que podría haber un mejor índice: por ejemplo, una exploración completa de la tabla con rows=1000y filtered=0.1%podría convertirse en una búsqueda de índice con rows=1y filtered=100%si agrega un buen índice.

Por otro lado, puede ignorar completamente este filteredvalor (que en la mayoría de los casos es una estimación realmente mala) y centrarse en las otras columnas más importantes (especialmente type, keyy extra) para optimizar su consulta. Por ejemplo, puede ser mejor deshacerse de un filesort(por ejemplo, mediante el uso de un índice que satisfaga el order by), incluso si resulta en un filteredvalor más bajo. Y un mejor typepuede resultar en una gran mejora del rendimiento, incluso si no cambia o incluso baja filtered. En el ejemplo anterior con filtered=0.1%, type=allya habría sido suficiente para indicar que podría mejorar esa consulta agregando un índice, sin mirarlo filtereden absoluto.

Por lo tanto, no tome ese valor demasiado en serio: ni 100significa que sus índices sean buenos, ni un valor más bajo indica necesariamente índices malos. typees un indicador mucho mejor para eso.


1
Gracias por la explicación. Se explica mucho para mí. Creo que es útil para mantener y seleccionar el buen índice
Iman Tumorang

@ImanTumorang Agregué un comentario y ejemplos al respecto: no tome ese valor demasiado en serio. Puede optimizar su consulta simplemente mirando typey extra(que es un arte en sí mismo); podrías vivir sin filtered, pero no sin type.
Solarflare

Bien entonces. Lo tengo. Ya lo leí en Mysql Docs, cómo afectan el rendimiento. Gracias por su explicación: D
Iman Tumorang

Otro consejo: el cálculo filtrado se omite para la última tabla unida. es decir, mostrará el 100% incluso si de hecho hay condiciones que filtrarán algunas de las filas examinadas. La razón es que cuesta algo estimar el factor de filtrado, y esto no afectará el plan de ejecución de la consulta si está en la última tabla, por lo que omiten el cálculo de manera predeterminada.
Bill Karwin
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.