tablas query para optimizando optimizacion lento lentas grandes eficientes datos consultas cantidades avanzadas mysql

query - optimizando consultas mysql



Si la condiciĆ³n realiza la consulta, si no realiza otra consulta (2)

Tratar:

select coalesce(i.id, t.id) id from (SELECT COUNT(*) countterm FROM table WHERE term LIKE "term") c left join (SELECT id, date FROM table_a FORCE INDEX(id) JOIN table_b ON table_a.id = table_b.id WHERE term LIKE "term") i on countterm > 4000 left join (SELECT id, date FROM table_a FORCE INDEX(term) JOIN table_b ON table_a.id = table_b.id WHERE term LIKE "term" GROUP BY term HAVING COUNT = 1) t on countterm <= 4000 ORDER BY coalesce(i.date, t.date) LIMIT 100;

Se siente bastante sencillo en cualquier cosa que no sea MySQL.

Básicamente, necesito cambiar el tipo de índice que estoy usando junto con algunas otras condiciones basadas en la cantidad de resultados que obtiene un término en particular.

Algo en el efecto de:

IF (SELECT COUNT(*) FROM table WHERE term LIKE "term") > 4000 EXECUTE QUERY A ELSE EXECUTE QUERY B

¿Es esto posible en una declaración de MySQL?

EDITAR:

Consulta A:

SELECT id FROM table_a FORCE INDEX(id) JOIN table_b ON table_a.id = table_b.id WHERE term LIKE "term" ORDER BY date LIMIT 100;

Consulta B:

SELECT id FROM table_a FORCE INDEX(term) JOIN table_b ON table_a.id = table_b.id WHERE term LIKE "term" GROUP BY term # These lines would be included for a few conditions not mentioned above.. but are necessary HAVING COUNT = 1 # same... ORDER BY date LIMIT 100;

El motivo del cambio de consulta es que obtengo tiempos de resultados dramáticamente diferentes según la popularidad del "término".


EDITAR: Lo que dije a continuación sobre la necesidad de un procedimiento almacenado NO ES VERDADERO. Prueba esto:

SELECT CASE WHEN ( (SELECT COUNT(*) FROM table WHERE term LIKE "term") > 4000 ) THEN <QUERY A> ELSE <QUERY B> END

Esta es, de hecho, una expresión de caso, y funciona bien fuera de un proceso almacenado :-)

Por ejemplo:

mysql> SELECT CASE WHEN ( 5 > 4 ) THEN ( SELECT ''foo'' ) ELSE ( SELECT ''bar'' ) END; +---------------------------------------------------------------------+ | CASE WHEN ( 5 > 4 ) THEN ( SELECT ''foo'' ) ELSE ( SELECT ''bar'' ) END | +---------------------------------------------------------------------+ | foo | +---------------------------------------------------------------------+ 1 row in set (0.01 sec) mysql> SELECT CASE WHEN ( 3 > 4 ) THEN ( SELECT ''foo'' ) ELSE ( SELECT ''bar'' ) END; +---------------------------------------------------------------------+ | CASE WHEN ( 3 > 4 ) THEN ( SELECT ''foo'' ) ELSE ( SELECT ''bar'' ) END | +---------------------------------------------------------------------+ | bar | +---------------------------------------------------------------------+ 1 row in set (0.00 sec)

Antigua respuesta a continuación para el interés histórico, ya que ya acumula votos:

Creo que puede usar lo siguiente, pero solo dentro de un procedimiento almacenado:

CASE (SELECT COUNT(*) FROM table WHERE term LIKE "term") > 4000 WHEN 1 THEN <QUERY A> ELSE <QUERY B> END CASE

Esta es una declaración CASE , a diferencia de una expresión CASE ... https://dev.mysql.com/doc/refman/5.0/en/case.html tiene más detalles sangrientos.

En realidad, sospecho que, en general, si desea ejecutar diferentes consultas de forma condicional, tendrá que mirar hacia procedimientos almacenados: podría estar equivocado, pero ese es mi instinto en este momento. ¡Si puedes hacerlo, probablemente será con expresiones CASE!

Una última edición: en cualquier ejemplo del mundo real, probablemente haría el bit condicional en mi aplicación, y simplemente lo entregaría a SQL (o a un ORM que generaría mi SQL) una vez que decidiera qué buscar.