mysql show table / columns - 性能问题

时间:2009-10-13 19:11:19

标签: php mysql performance

我正在开发一个基本的php / mysql CMS,并且有一些关于性能的问题。

当从前端查看博客页面(或其他可排序数据)时,我想允许将简单的“排序”变量添加到查询字符串中,从而允许按任何列对帖子进行排序。显然我不能接受来自查询字符串的任何,并且需要确保该列存在于该表中。

目前我正在使用

SHOW TABLES;

获取数据库中所有表的列表,然后循环表名数组并执行

SHOW COLUMNS;

每个。

我担心我的CMS可能会在这里受到影响。我考虑过使用表名的静态数组,但是在我实现插件系统时需要保持这种灵活性。

有人对我如何更简洁地提出任何建议吗?

三江源

4 个答案:

答案 0 :(得分:3)

如果你使用mysql 5+,那么你会发现数据库information_schema对你的任务有用。在此数据库中,您可以通过简单的SQL查询访问表,列,引用的信息。例如,您可以找到表格中是否有特定列:

SELECT count(*) from COLUMNS 
WHERE 
    TABLE_SCHEMA='your_database_name' AND
    TABLE_NAME='your_table' AND
    COLUMN_NAME='your_column';

以下是存在特定列的表的列表:

SELECT TABLE_SCHEMA, TABLE_NAME from COLUMNS WHERE COLUMN_NAME='your_column';

答案 1 :(得分:1)

由于您在执行实际查询之前当前正在两次访问数据库,因此您可能需要考虑将实际查询包装在try{}块中。然后,如果查询有效,那么您只执行了一次操作而不是3.如果查询失败,您仍然只会浪费一个查询而不是两次。

重要的警告(像往常一样!)是在执行此操作之前要清除任何用户输入。

答案 2 :(得分:0)

您可以预先查询表并将列存储在缓存层(即memcache或APC)中。然后,您可以将文件的过期时间设置为无限,只有在新添加,更新等插件时才删除并重新创建缓存文件。

答案 3 :(得分:0)

我想最好的办法就是把你从Show table等得到的所有东西都放在一个文件中然后只包含它,而不是每次都运行它。如果项目仍在开发中,或者您认为字段会发生变化,请实施某种缓存。