У меня есть таблица, на которую ссылаются внешние ключи во многих других таблицах. В моей программе, если я хочу удалить одну из этих строк, мне нужно сначала найти зависимости и представить их пользователю - «Этот объект зависит от x из таблицы y, z из таблицы q и т. Д.». Я также ожидаю, что число таблиц, имеющих внешние ключи к этой таблице, значительно возрастет со временем.
Является ли база данных information_schema хорошим способом поиска всех зависимостей? Я попытался запросить его, чтобы получить список всех таблиц, имеющих внешние ключи для моей таблицы, затем выполнить итерацию по результату и выбрать все записи в каждой таблице, где значение внешнего ключа соответствует значению, которое пытается удалить пользователь. У меня есть следующий запрос:
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')
, который идеально подходит для определения таблиц, в которых мне нужно искать, однако это очень медленно. Выполнение запроса в лучшем случае занимает от 1 до 2 секунд на моей машине для разработки, что значительно сократит время его запуска на рабочем сервере, но все равно будет довольно медленным.
Мне нужно знать, если это плохая идея - использовать information_schema таким образом. Если нет, как я могу извлечь лучшую производительность из запроса. Является ли запрос, который я использую, твердым или есть лучший способ сделать это? Если да, то как лучше решить эту проблему с точки зрения удобства обслуживания.