我正在开发一个基本的php / mysql CMS,并且有一些关于性能的问题。
当从前端查看博客页面(或其他可排序数据)时,我想允许将简单的“排序”变量添加到查询字符串中,从而允许按任何列对帖子进行排序。显然我不能接受来自查询字符串的任何,并且需要确保该列存在于该表中。
目前我正在使用
SHOW TABLES;
获取数据库中所有表的列表,然后循环表名数组并执行
SHOW COLUMNS;
每个。
我担心我的CMS可能会在这里受到影响。我考虑过使用表名的静态数组,但是在我实现插件系统时需要保持这种灵活性。
有人对我如何更简洁地提出任何建议吗?
三江源
答案 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等得到的所有东西都放在一个文件中然后只包含它,而不是每次都运行它。如果项目仍在开发中,或者您认为字段会发生变化,请实施某种缓存。