Uff*_*ffo 0 php mysql zend-framework
我有一个包含超过400万个数据的mysql表; 好吧问题是,一些查询工作,有些不依赖于搜索项,如果搜索项在表中有大量数据,而不是我得到以下错误:
Fatal error: Allowed memory size of 1048576000 bytes exhausted (tried to allocate 75 bytes) in /home/****/public_html/Zend/Db/Statement/Pdo.php on line 290
Run Code Online (Sandbox Code Playgroud)
我目前有启用元数据的Zend Framework缓存,我在该表的所有字段上都有索引.该站点在具有2GB内存的专用服务器上运行.
我还将内存限制设置为:ini_set("memory_limit","1000M");
还有其他我可以优化的东西吗?
这些是我目前使用的查询类型:
$do = $this->select()
->where('branche LIKE ?','%'.mysql_escape_string($branche).'%')
->order('premium DESC');
}
//For name
if(empty($branche) && empty($plz))
{
$do = $this->select("MATCH(`name`) AGAINST ('{$theString}') AS score")
->where('MATCH(`name`) AGAINST( ? IN BOOLEAN MODE)', $theString)
->order('premium DESC, score');
}
Run Code Online (Sandbox Code Playgroud)
还有其他一些,但它们几乎是一样的.
最好的祝福
// LE
ZEND_PAGINATOR代码
$d = $firmen->doSearch($finalType,$theKeyword,$thePLZ,$theBranche,false,false,false,$theOrder);
if ($d !== false) {
$paginator = Zend_Paginator::factory($d);
$paginator->setItemCountPerPage(5)
->setPageRange(10)
->setCurrentPageNumber($pag);
$this->view->data = $paginator;
Run Code Online (Sandbox Code Playgroud)
// MYSQL EXPLAIN结果
mysql> EXPLAIN select * from `wirtscha_ksw`.`firmen` WHERE `name` LIKE '%gmbh%';ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id: 32911
Current database: *** NONE ***
+----+-------------+--------+------+---------------+------+---------+------+---------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+--------+------+---------------+------+---------+------+---------+-------------+
| 1 | SIMPLE | firmen | ALL | NULL | NULL | NULL | NULL | 3749155 | Using where |
+----+-------------+--------+------+---------------+------+---------+------+---------+- ------------+
1 row in set (0.03 sec
Run Code Online (Sandbox Code Playgroud)
你真的需要一次加载所有记录吗?我建议你在这些查询中使用LIMIT.如果您需要显示数据,还可以考虑使用Zend_Paginator.
更新:你正在采取的方法是通过Zend_Paginator所有结果,这是大型结果集过度使用.在这些情况下,更优化的方法是仅将查询传递给它,然后它将仅处理获取显示页面所需的数据(这包括计算记录数量并将查询限制为每个结果的数量)页面),例如:
$paginator = new Zend_Paginator(
// $query is an instance of Zend_Db_Select
new Zend_Paginator_Adapter_DbSelect($query);
);
$paginator->setItemCountPerPage(5)
->setPageRange(10)
->setCurrentPageNumber($pag);
Run Code Online (Sandbox Code Playgroud)