sql >> Base de Datos >  >> RDS >> Mysql

En MySQL, ¿poner SELECT foo aumenta el rendimiento si foo está indexado?

Lo primero que debe tener en cuenta es que MySQL solo usa un índice por psuedo-SELECT (no declaración):cuando ve el resultado de SELECT usando EXPLAIN, verá qué índice se eligió por. EXPLAIN solo se puede ejecutar en SELECTS, por lo que debemos asumir que DELETE/UPDATE está usando el mismo plan cuando cambia la sintaxis para SELECT...

La mayoría de las bases de datos (las incrustadas pueden ser extrañas) que yo sepa, admiten el uso de índices en las siguientes cláusulas:

  • SELECCIONAR
  • ÚNETE (sintaxis ANSI-92)
  • DÓNDE (porque hay ANSI-89 y filtrado aquí)
  • HAVING (WHERE equivalente, pero a diferencia de WHERE - permite el uso agregado sin necesidad de subconsulta)
  • ORDENAR POR

No estoy 100% en GROUP BY, así que lo omito por el momento.

En última instancia, es la elección de los optimizadores qué usar en función de su algoritmo y las estadísticas que tiene disponibles. Puede utilizar la sintaxis ANALYZE TABLE para actualizar las estadísticas (periódicamente, no constantemente, por favor).

Anexo

MySQL también limita la cantidad de espacio para asignar índices - 1,000 bytes para tablas MyISAM y 767 bytes para tablas InnoDB . Debido a que MySQL solo usa un índice por psuedo-SELECT, los índices de cobertura (índices que incluyen más de una columna) son una buena idea, pero realmente se trata de probar la consulta más común y optimizarla lo mejor que pueda. La prioridad de indexación debe ser:

  1. Clave principal (en algún lugar de v5, la creación de índices para el pk se volvió automática)
  2. Claves foráneas (siguiente candidato JOIN más probable
  3. Criterios de filtración (suponiendo que tenga espacio)