6.1 Introducción

Ahora pasemos de la teoría a la práctica.

“En teoría, no hay diferencia entre la teoría y la práctica. En la práctica, lo son".

Vivimos en el mundo real y, en última instancia, todos los productos de software se crean para personas vivas. Y estas personas vivas están muy molestas por los sitios que se cargan lentamente y los programas que se ralentizan.

Y si una consulta a la base de datos toma más de un segundo, esto es inaceptable . Los usuarios simplemente no usarán un producto que tenga páginas/funcionalidades tan lentas.

Pero a menudo, para mostrar una página, debe realizar varias docenas de consultas a la base de datos. Y si se ejecutan secuencialmente, ya no tienes un límite de segundos, sino digamos 100 ms por solicitud.

Estas son las 5 formas principales en que los programadores aceleran las consultas de la base de datos:

  1. Adición de índices a tablas en la base de datos.
  2. Reescritura y optimización de consultas.
  3. Habilite (y configure) el almacenamiento en caché en el lado de la base de datos.
  4. Habilite el almacenamiento en caché en el lado del cliente.
  5. Realización de la desnormalización de la base de datos.

Ya está familiarizado con todas estas cosas en su mayor parte, por lo que los siguientes serán solo consejos prácticos.

6.2 Índices

No es ningún secreto que trabajar con una base de datos ocupa la mayor parte del trabajo de casi cualquier sitio. Y es que trabajar con la base de datos suele ser el cuello de botella de las aplicaciones web.

En este artículo me gustaría dar consejos prácticos sobre el uso de MySQL.

Diré enseguida:

  • este artículo está escrito sobre MySQL, aunque es probable que las cosas generales sean ciertas para cualquier DBMS.
  • todo lo escrito en el artículo es mi punto de vista personal, y no es la verdad última.
  • El consejo no pretende ser nuevo y es el resultado de una generalización de la literatura leída y de la experiencia personal.
  • en el marco de este artículo, no tocaré los problemas de configuración de MySQL.

Los problemas al usar MySQL se pueden dividir en los siguientes tres grupos (en orden de importancia):

  1. No uso o mal uso de los índices.
  2. Estructura de base de datos incorrecta.
  3. Consultas SQL incorrectas o subóptimas.

Echemos un vistazo más de cerca a cada uno de estos grupos.

Uso de índices

No usar o usar mal los índices es lo que más suele ralentizar las consultas. Para aquellos que no están familiarizados con el mecanismo de cómo funcionan los índices o aún no han leído sobre esto en el manual, les recomiendo encarecidamente que lo lean.

Consejos para usar índices:

  • No es necesario indexar todo . Muy a menudo, sin comprender el significado, las personas simplemente indexan todos los campos de una tabla. Los índices aceleran las recuperaciones, pero ralentizan las inserciones y actualizaciones de filas, por lo que la elección de cada índice debe ser significativa.
  • Uno de los principales parámetros que caracteriza al índice es la selectividad, que es el número de elementos diferentes en el índice. No tiene sentido indexar un campo que tiene dos o tres valores posibles. Habrá poco beneficio de dicho índice.
  • La elección de índices debe comenzar con un análisis de todas las consultas en una tabla determinada. Muy a menudo, después de dicho análisis, en lugar de tres o cuatro índices, puede hacer uno compuesto.
  • Cuando se utilizan índices compuestos, el orden de los campos en el índice es fundamental.
  • No te olvides de cubrir los índices. Si todos los datos de una consulta se pueden recuperar de un índice, MySQL no accederá a la tabla directamente. Dichas solicitudes se ejecutarán muy rápidamente. Por ejemplo, para una consulta SELECT name FROM user WHERE login='test'con un índice (inicio de sesión, nombre), no se requiere acceso a la tabla. A veces tiene sentido agregar un campo adicional a un índice compuesto, lo que hará que el índice cubra y acelere las consultas.
  • Para los índices de fila, a menudo es suficiente indexar solo una parte de la fila. Esto puede reducir significativamente el tamaño del índice.
  • Si %es al principio, LIKE(SELECT * FROM table WHERE field LIKE '%test')no se utilizarán índices.
  • El índice FULLTEXT sólo se utiliza con la sintaxis MATCH ... AGAINST .

6.3 Estructura de la base de datos

Una base de datos bien diseñada es la clave para un trabajo rápido y eficiente con la base de datos. Por otro lado, una base de datos mal diseñada siempre es un dolor de cabeza para los desarrolladores.

Consejos de diseño de base de datos:

  1. Utilice los tipos de datos más pequeños posibles. Cuanto mayor sea el tipo de datos, cuanto mayor sea la tabla, más accesos al disco se necesitan para obtener los datos. Use un procedimiento muy conveniente: SELECT * FROM table_name PROCEDURE ANALYSE();para determinar los tipos de datos mínimos posibles.
  2. Observe las formas normales durante la fase de diseño. A menudo, los programadores recurren a la desnormalización ya en esta etapa. Sin embargo, en la mayoría de los casos, al comienzo del proyecto, está lejos de ser obvio cómo puede resultar esto. Desnormalizar una tabla es mucho más fácil que sufrir una desnormalización subóptima. Y JOINa veces funciona más rápido que las tablas desnormalizadas incorrectamente.
  3. No use NULLcolumnas a menos que las necesite conscientemente.

6.4 Consultas SQL.

Con la misma frecuencia, existe el deseo de reescribir todas las consultas en SQL nativo para que la consulta sea lo más rápida posible. Si decides hacer esto, aquí hay algunos consejos:

  1. Evite las solicitudes en un bucle. SQL es un lenguaje de conjuntos, y la escritura de consultas no debe abordarse en el lenguaje de las funciones, sino en el lenguaje de los conjuntos.
  2. Evitar *(asteriscos) en las consultas. Siéntase libre de enumerar exactamente los campos que elija. Esto reducirá la cantidad de datos obtenidos y enviados. Además, no se olvide de cubrir los índices. Incluso si selecciona todos los campos de la tabla, es mejor enumerarlos. En primer lugar , mejora la legibilidad del código. Cuando se usan asteriscos, es imposible averiguar qué campos hay en la tabla sin mirarlos. En segundo lugar , hoy su tabla tiene cinco columnas INT , y un mes después se agregaron TEXT y BLOB más , y el asterisco permaneció como estaba.
  3. Cuando está paginado, para obtener el número total de registros, use SQL_CALC_FOUND_ROWSy SELECT FOUND_ROWS();When used SQL_CALC_FOUND_ROWS MySQL, almacena en caché el número de filas seleccionado (antes de que se aplique LIMIT), y cuando se usa, SELECT FOUND_ROWS()solo devuelve este valor almacenado en caché sin tener que volver a ejecutar la consulta.
  4. No olvide que hay INSERTuna sintaxis para múltiples inserciones. Una consulta se ejecutará un orden de magnitud más rápido que varias consultas en un bucle.
  5. Úselo LIMITdonde no necesite todos los datos.
  6. Se usa INSERT… ON DUPLICATE KEY UPDATE…en lugar de y INSERTo UPDATEdespués de la selección y, a menudo, en lugar de REPLACE.
  7. No olvides esta característica increíble GROUP_CONCAT. Puede ayudar con consultas complejas.