Explique en detalle cómo escribir declaraciones MySQL de alto rendimiento_MySQL.
En las primeras etapas del desarrollo del sistema de aplicaciones, debido a la falta de datos de la base de datos, no pudimos comprender el rendimiento de varios métodos de escritura de declaraciones SQL para consultar declaraciones SQL y escribir vistas complejas. Sin embargo, si el sistema de solicitud se somete a solicitudes reales, a medida que aumentan los datos en la base de datos, la velocidad de respuesta del sistema se convierte en uno de los problemas más importantes que el sistema necesita resolver actualmente. Un aspecto muy importante de la optimización del sistema es la optimización de las declaraciones SQL. Para datos masivos, la diferencia de velocidad entre declaraciones SQL inferiores y declaraciones SQL de alta calidad puede llegar a cientos de veces. Se puede ver que para un sistema, no se trata simplemente de realizar sus funciones, sino de escribir declaraciones SQL de alta calidad para mejorar la usabilidad del sistema.
En la mayoría de los casos, Oracle utiliza índices para recorrer tablas más rápido y el optimizador mejora principalmente el rendimiento en función de índices definidos. Sin embargo, si el código SQL escrito en la cláusula donde de la declaración SQL no es razonable, el optimizador eliminará el índice y utilizará un escaneo completo de la tabla. Generalmente, este tipo de declaración SQL se denomina declaración SQL inferior. Al escribir declaraciones SQL, es necesario comprender el principio del optimizador que elimina índices, lo cual es muy útil para escribir declaraciones SQL de alto rendimiento.
A continuación se presentan en detalle algunos problemas a los que se debe prestar atención al escribir cláusulas donde en declaraciones SQL. En estas cláusulas donde, incluso si algunas columnas tienen índices, el sistema no puede usar el índice cuando ejecuta la declaración SQL debido a la mala calidad del SQL, y también usa un escaneo completo de la tabla, lo que reduce en gran medida la velocidad de respuesta.
1. Vacío y no vacío:
Nulo no se puede utilizar como índice y cualquier columna con un valor nulo no se incluirá en el índice. Incluso si el índice tiene varias columnas, siempre que una de las columnas contenga un valor nulo, esa columna se excluirá del índice. Es decir, si una columna tiene valores nulos, no habrá ninguna mejora en el rendimiento incluso si está indexada.
Cualquier declaración que use es nulo o no nulo en una cláusula donde no podrá usar un índice por parte del optimizador de declaraciones.
2. Unir columnas:
Para columnas con combinaciones, el optimizador no utilizará el índice incluso si el último valor de combinación es un valor estático. Veamos un ejemplo. Supongamos que hay una mesa de empleados. El nombre y apellido del empleado se almacenan en dos columnas (nombre y apellido). Ahora queremos consultar por un empleado llamado Bill Cliton.
La siguiente es la declaración SQL que utiliza la consulta de combinación.
Seleccione * de los empleados
Dónde
Nombre | ' ' | Apellido = 'Beill Cliton '
Arriba del La declaración puede averiguar completamente si hay un empleado llamado Bill Cliton, pero debe tenerse en cuenta que el optimizador del sistema no utiliza el índice creado en función del apellido.
Al utilizar la siguiente declaración SQL, el sistema Oracle puede utilizar un índice creado en función del apellido.
Seleccione * del empleado
Dónde
Nombre='Beill' y apellido='Cliton'
¿Qué pasa con lo siguiente? situación? Si el nombre del empleado Bill Cliton se almacena en una variable (nombre), ¿cómo evitar recorrer todo el proceso y utilizar un índice? Puede usar una función para separar los nombres y apellidos en nombres de variables, pero debe tener en cuenta que esta función no se puede usar en columnas indexadas. El siguiente es el script de consulta SQL:
seleccione * del empleado
donde
primer_nombre = SUBSTR(&&nombre',1,instrumento (& nombre',' ')-1)
AND
apellido = SUBSTR(& nombre,instrumento(& nombre?,' ')+1)
3. con carácter comodín (%):
Utilice el ejemplo anterior para observar esta situación también. El requisito actual es consultar la tabla de empleados en busca de personas cuyos nombres contengan cliton.
Puede utilizar la siguiente instrucción SQL de consulta:
seleccione * del empleado donde apellido como '%cliton% '
Aquí, porque el carácter comodín (%) aparece al principio del término de búsqueda, Oracle El sistema no utiliza el índice de apellidos. En muchos casos, esto puede no ser evitable, pero hay que ser consciente de ello. El uso de comodines como este ralentizará su consulta. Sin embargo, el optimizador puede utilizar el índice cuando aparecen caracteres comodín en otras partes de la cadena. Este índice se utiliza para la siguiente consulta:
seleccione * de los empleados, donde el apellido es como "c%"
Ordenar por declaración:
< La instrucción p>ORDER BY determina cómo Oracle ordena los resultados de la consulta devuelta. La instrucción Ordenar por no tiene restricciones especiales sobre las columnas que se ordenarán y también se pueden agregar funciones (como unir o agregar) a las columnas. Cualquier elemento no indexado o expresión calculada en la instrucción Ordenar por ralentizará la consulta.Compruebe cuidadosamente la instrucción order by para buscar elementos o expresiones no indexados que reduzcan el rendimiento. La solución a este problema es reescribir la instrucción order by para usar un índice, o crear otro índice para la columna utilizada, y definitivamente evitar el uso de expresiones en la cláusula order by.
5. No:
A menudo utilizamos algunas expresiones lógicas en la cláusula donde cuando realizamos consultas, como mayor que, menor que, igual a, no igual a, etc. , y también podemos usar and (and), or (or) y not (not). NOT no se puede utilizar para negar ningún símbolo de operación lógica. El siguiente es un ejemplo de una cláusula NOT:
...if not (status = 'valid')
Si quieres usar NOT, debes poner paréntesis antes de la cláusula invertida. frase, prefije la frase con el operador NOT. El operador NOT está contenido dentro de otro operador lógico, que es el operador de desigualdad (). En otras palabras, incluso si la palabra NOT no se agrega explícitamente a la cláusula donde de consulta, NOT todavía está en el operador, como se muestra en el siguiente ejemplo: donde estado 'INVÁLIDO '
Mire el siguiente ejemplo : seleccione * de donde el salario del empleado 3000;
Para esta consulta, puede usar no reescribirla como no:seleccione * de donde el salario del empleado 3000;
Aunque los resultados de estos Dos consultas son iguales, pero el segundo plan de consulta será más rápido que el primer plan de consulta. La segunda consulta permite a Oracle usar índices en la columna de salario, mientras que la primera consulta no puede usar índices.
6. Existe en:
A veces se compara una columna con un rango de valores. La forma más sencilla es utilizar una subconsulta en la cláusula donde. Hay dos tipos de subconsultas que se pueden utilizar en la cláusula donde.
El primer formato es utilizar el operador IN:...dónde aparece en (seleccione * de...dónde...);
El segundo formato es utilizar Operador EXIST: ...exist position(seleccione "x" de ...dónde...);
Creo que la mayoría de la gente usará el primer formato porque es más fácil de escribir, pero en realidad el El segundo formato es mucho más eficiente que el primero. En Oracle, casi todas las subconsultas del operador IN se pueden reescribir como subconsultas utilizando EXISTS.
En el segundo formato, la subconsulta comienza con ? Seleccione "X" para comenzar. Con la cláusula EXISTS, no importa qué datos extraiga la subconsulta de la tabla, solo mira la cláusula dónde. De esta manera, el optimizador no necesita recorrer toda la tabla y solo necesita completar el trabajo de acuerdo con el índice (suponiendo que la columna utilizada en la declaración donde tenga un índice aquí). En comparación con la cláusula IN, EXISTS utiliza una subconsulta unida, que es más difícil de construir que una subconsulta IN.
Al utilizar EXIST, el sistema Oracle primero verificará la consulta principal y luego ejecutará las subconsultas hasta encontrar la primera coincidencia, lo que ahorra tiempo.
Cuando el sistema Oracle ejecuta una subconsulta IN, primero ejecuta la subconsulta y almacena la lista de resultados obtenidos en la tabla temporal del índice. El sistema suspende la consulta principal antes de ejecutar la subconsulta y luego ejecuta la consulta principal después de que la subconsulta se completa y se almacena en la tabla temporal. Por eso usar EXISTS es más rápido que usar IN.
Al mismo tiempo, debemos usar NOT EXISTS en lugar de NOTAIN siempre que sea posible. Aunque ambos usan NOT (los índices no se pueden usar para ralentizar las cosas), NOT EXISTS es más eficiente que las consultas NOTAIN.