Tengo una tabla a la que hacen referencia las claves foráneas en muchas otras tablas. En mi programa, si quiero eliminar una de estas filas, primero necesito buscar dependencias y presentarlas al usuario: "Este objeto depende de x de la tabla y, z de la tabla q, etc.". También espero que el número de tablas que tienen claves externas a esta tabla crezca considerablemente con el tiempo.¿Está consultando la base de datos de información de MySQL una buena manera de encontrar tablas relacionadas?
¿Es la base de datos de information_schema una buena forma de hacer una búsqueda de todas las dependencias? Traté de consultarlo para recuperar una lista de todas las tablas que tienen claves externas a mi tabla, luego iterar sobre el resultado y seleccionar todas las entradas de cada tabla donde el valor de la clave externa coincide con el valor que el usuario está tratando de eliminar. La consulta que tengo es la siguiente:
SELECT * FROM `KEY_COLUMN_USAGE` kcu
LEFT JOIN TABLE_CONSTRAINTS tc
ON tc.CONSTRAINT_NAME = kcu.CONSTRAINT_NAME
WHERE tc.CONSTRAINT_TYPE='FOREIGN KEY'
AND (kcu.REFERENCED_TABLE_SCHEMA='db')
AND (kcu.REFERENCED_TABLE_NAME = 'testtable')
que funciona perfectamente para la determinación de las tablas que tengo que buscar, sin embargo, es muy lento. La consulta tarda de 1 a 2 segundos en el mejor de los casos para ejecutarse en mi máquina de desarrollo, lo que reducirá mucho cuando la ejecute en mi servidor de producción, pero seguirá siendo bastante lenta.
Necesito saber si es una mala idea usar information_schema de esta manera. Si no, cómo puedo extraer un mejor rendimiento de la consulta. ¿La consulta que estoy usando es sólida o hay una mejor manera de hacerlo? Si es así, ¿cuál es la mejor manera de abordar este problema desde una perspectiva de mantenimiento?
De acuerdo con [un artículo] (http://www.mysqlperformanceblog.com/2011/12/23/solving-information_schema-slowness /) por Peter Zaitsev, recomienda este comando: 'set global innodb_stats_on_metadata = 0'. – Mei