查询MySQL information_schema数据库是查找相关表的好方法吗?

Sha*_*obe 8 mysql

我有一个表,在许多其他表上由外键引用.在我的程序中,如果我想删除其中一行,我需要首先搜索依赖项并将它们呈现给用户 - "此对象依赖于表y中的x,表q中的z等".我还希望具有该表的外键的表的数量随着时间的推移而显着增长.

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')
Run Code Online (Sandbox Code Playgroud)

这对于确定我需要搜索的表格非常有效,但是它非常慢.查询最多需要大约1到2秒才能在我的开发机器上执行,当我在生产服务器上运行它时会减少很多,但仍然会很慢.

我需要知道以这种方式使用information_schema是不是一个坏主意.如果没有,我如何从查询中提取更好的性能.我使用的查询是否可靠或有更好的方法吗?如果是这样,我应该如何从可维护性的角度解决这个问题.

Pas*_* T. 4

德沃夏克是对的,INFORMATION_SCHEMA 就是为此而设计的。

关于您的性能问题,有多种方法可以提高性能

  • 简单的方法,但不会带来太大的改进:将信息存储在静态变量中。至少每页查询只会发生一次

  • 使用持久缓存:替代的 PHP 缓存可以帮助您(请参阅http://fr3.php.net/manual/en/book.apc.php)。您将从信息模式获得的信息非常适合存储在持久缓存中。

  • 使用 ORM 库,例如 Doctrine ( http://www.doctrine-project.org/ ) 查看文件 lib/Doctrine/Import/Mysql.php 将显示它完全满足您的需要,甚至更多。