检查数据库表是否存在 - 性能?

时间:2010-12-18 16:42:03

标签: php mysql

我想为未指定的框架/系统制作一些简单的对象/模型。

此外,我想使用MySQL作为我的数据的后端。

我的目标是简单实现 - 对配置文件进行小的更改,基本上就是这样。

我的问题是,我确信在使用我的模型时,我需要检查数据库表是否实际存在 - 如果没有,请为我创建表。

我在想这样的事情:

<?php

  class MyObject
  {

    public function __construct()
    {
      $dal->query("SHOW TABLES LIKE 'MyTable'");

      if($dal->num_rows() == 0)
        $this->_createTables();
    }
    ...
  }
?>

但是我担心这个型号的性能 - 我正在寻找关于我的解决方案效率或更好的解决方案的确认。

4 个答案:

答案 0 :(得分:2)

在我看来,根据您的应用程序的需要,您可能最好只在发生错误时检查此条件,并假设该表存在。这样的事情可以避免在每个实例上进行额外的查询(但是,您应该将检查放入自己的方法中)。

public function insert($data, $spiralingToDeath=false)
{
  // (do actual insertion here)

  if ($this->isError) {
    // nothing obvious

    if ($spiralingToDeath) {
      // recursion check
      throw new DBException("Tried to create a table and failed.");
    } else {
      $dal->query("SHOW TABLES LIKE 'MyTable'");

      if($dal->num_rows() == 0) {
         $this->_createTables();
      } 
      // try again:
      $this->insert($data, true);
   }
 }
}

答案 1 :(得分:1)

CREATE TABLE IF NOT EXISTS怎么样?

答案 2 :(得分:0)

要求用户通过编辑器更改配置,并让编辑器在保存配置之前修改表格布局。

答案 3 :(得分:0)

另外,你可能想要考虑只调用'show tables',然后在私有var中在类级别缓存它,这样你可以稍后做一个简单的isset,例如。

isset($this->tables_cache[$db_name][$table_name])

这将允许您使用更多表格进行更好的扩展。

您还可以将其保存为文件系统中的json结构或序列化结构,将其加载到类的__construct上,然后(重新)将其保存在__destruct上。