当我开始使用它们时,我注意到 Kohana 3 ORM 为我的每个模型运行“显示完整列”:
SHOW FULL COLUMNS FROM `mytable`
此查询可能需要几个时钟周期才能执行(在 Kohana 分析器中,它实际上是我当前应用程序中运行的所有查询中最慢的)。
有没有办法通过禁用此行为并明确定义我的模型中的列来帮助 Kohana 3 ORM 加速?
当我开始使用它们时,我注意到 Kohana 3 ORM 为我的每个模型运行“显示完整列”:
SHOW FULL COLUMNS FROM `mytable`
此查询可能需要几个时钟周期才能执行(在 Kohana 分析器中,它实际上是我当前应用程序中运行的所有查询中最慢的)。
有没有办法通过禁用此行为并明确定义我的模型中的列来帮助 Kohana 3 ORM 加速?
biakaveron用评论回答了我的问题,所以我只能给出正确的答案。
取自官方 Kohana 论坛上的 Wouters 答案(biakaveron 指出的地方),这是正确的答案:
这很容易,
$table_columns
是一个包含很多信息的大数组,但实际上在 ORM 中只使用了很少的这些信息。这将做:
protected $_table_columns = array(
'id' => array('type'=>'int'),
'name' => array('type'=>'string'),
'allowNull' => array('type'=>'string','null'=>TRUE),
'created' => array('type'=>'int')
);
执行该查询时没有太多开销;尽管您可以通过手动定义它们来缓存它们/跳过该过程(如果这确实是您想要覆盖$_table_columns
模型中的内容,但我不知道您可以节省多少时间 - 值得尝试)。
我提出了一个缓存替代方案,list_columns()
但它被拒绝了,因为它真的不是那么大的瓶颈:http ://dev.kohanaframework.org/issues/2848
不要忘记下划线:
protected $_table_columns = array(
'id' => array('type'=>'int'),
'name' => array('type'=>'string'),
'allowNull' => array('type'=>'string','null'=>TRUE),
'created' => array('type'=>'int')
);
这将为您提供完整的列信息作为数组:
var_export($ORM->list_columns());
不确定 kohana 团队如何说“显示完整列”在所有情况下都像从缓存中快速读取一样运行。由于 . 所以我们不得不关掉它。
https://blogs.oracle.com/dlutz/entry/mysql_query_cache_sizing
显示完整列的证明是运行次数最多的查询 https://www.dropbox.com/s/zn0pbiogt774ne4/Screenshot%202015-02-17%2018.56.21.png?dl=0
来自 NewRelic mysql 插件的磁盘上临时表的证明。 https://www.dropbox.com/s/cwo09sy9qxboeds/Screenshot%202015-02-17%2019.00.19.png?dl=0
并且按查询计数排序的最有问题的查询(> 100ms)。
https://www.dropbox.com/s/a1kpmkef4jd8uvt/Screenshot%202015-02-17%2018.55.38.png?dl=0