重慶分公司,新征程啟航
為企業提供網站建設、域名注冊、服務器等服務
為企業提供網站建設、域名注冊、服務器等服務
mysql_query函數查詢的方式是查詢出全部結果后緩存到內存中,這樣就會出現超內存的現象,使用另外一個函數mysql_unbuffered_query可以解決這個問題,mysql_unbuffered_query不會緩存結果集,而是查詢出來數據后立馬對結果集進行操作,也就是便查詢邊返回,這樣就不會出現超出內存的現象,但是使用mysql_unbuffered_query的是時候不能使用 mysql_num_rows() 和 mysql_data_seek()。并且向 MySQL 發送一條新的 SQL 查詢之前,必須提取掉所有未緩存的 SQL 查詢所產生的結果行。例如:
創新互聯公司于2013年成立,公司以網站制作、成都網站設計、系統開發、網絡推廣、文化傳媒、企業宣傳、平面廣告設計等為主要業務,適用行業近百種。服務企業客戶數千家,涉及國內多個省份客戶。擁有多年網站建設開發經驗。為企業提供專業的網站建設、創意設計、宣傳推廣等服務。 通過專業的設計、獨特的風格,為不同客戶提供各種風格的特色服務。
使用緩存結果集的代碼:
function selecttest()
{
try {
$pdo = new PDO("mysql:host=localhost;dbname=test", 'root', '123456');
// 不使用緩存結果集方式
// $pdo-setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);
$sth = $pdo-prepare('select * from test');
$sth-execute();
echo '最初占用內存大?。? . memory_get_usage() . "\n";
$i = 0;
while ($result = $sth-fetch(PDO::FETCH_ASSOC)) {
$i += 1;
if ($i 10) {
break;
}
sleep(1);
print_r($result);
echo '占用內存大?。? . memory_get_usage() . "\n";
}
} catch (Exception $e) {
echo $e-getMessage();
}
}
執行時將會報超出內存的錯誤:
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 204800000 bytes) in E:\ProgramDevelopment\RuntimeEnvironment\xampp\htdocs\test\test.php on line 56
Call Stack:
0.0005 135392 1. {main}() E:\ProgramDevelopment\RuntimeEnvironment\xampp\htdocs\test\test.php:0
0.0005 135568 2. test-selecttest() E:\ProgramDevelopment\RuntimeEnvironment\xampp\htdocs\test\test.php:85
0.0050 142528 3. PDOStatement-execute() E:\ProgramDevelopment\RuntimeEnvironment\xampp\htdocs\test\test.php:56
將上面代碼中的$pdo-setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);一行的注釋去掉后將不在緩存結果集,這時運行該函數的結果如下:
最初占用內存大小:144808
Array
(
[id] = 1
[a] = v
[b] = w
[c] = i
)
占用內存大?。?45544
Array
(
[id] = 2
[a] = b
[b] = l
[c] = q
)
占用內存大?。?45544
Array
(
[id] = 3
[a] = m
[b] = p
[c] = h
)
占用內存大?。?45536
Array
(
[id] = 4
[a] = j
[b] = i
[c] = b
)
占用內存大小:145536
可以看到,這時返回一條數據內存占用非常的小,也就700多字節,這樣就不會出現超出內存的錯誤了。
使用for循環
定義變量$i,配合select * from table where ………… limit $i,100
這樣就可以了
我之前就做過,但因為換了工作,代碼在之前的公司,否則就可以讓你參考下了
另外,我覺得100太少了,最起碼得改成1000才行
sql多用戶訪問數據庫其實就是事務并發,會引起如下問題:
1、臟讀:一個事務讀取到了另外一個事務沒有提交的數據
事務1:更新一條數據
事務2:讀取事務1更新的記錄
事務1:調用commit進行提交
此時事務2讀取到的數據是保存在數據庫內存中的數據,稱為臟讀。
讀到的數據為臟數據
詳細解釋:
臟讀就是指:當一個事務正在訪問數據,并且對數據進行了修改,而這種修改還沒有提交到數據庫中,這時,
另外一個事務也訪問這個數據,然后使用了這個數據。因為這個數據是還沒有提交的數據,那么另外一個