[英]Huge mysql table with 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
我目前啟用了用於元數據的Zend Framework緩存,在該表的所有字段上都有索引。該站點在具有2GB RAM的專用服務器上運行。
我還將內存限制設置為: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');
}
和其他一些,但它們幾乎相同。
最好的祝福
// 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;
// MYSQL解釋結果
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
您真的需要一次加載所有記錄嗎? 我建議您在這些查詢中使用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);
Zend分頁器是開箱即用的內存。 我必須已經將默認的memory_limit x4增加到512M,並且該測試數據庫的大小不如最終的實時版本大。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.