最近遇到一個問題,就是在高並發下,mysql性能出現了瓶頸,由於PHP是一種弱類型的語言,沒有類型一說。因此,當mysql返回並非預期結果時,會導致後續邏輯錯誤。
1)線程阻塞測試
當sql語句執行太慢,會導致mysql的連接數被耗盡,無法處理新的請求。
測試方法
執行set global max_connections=1;語句,並在另一個程序中開啟長連接占用該連接,此時,mysql服務已經無連接可用。
PHP代碼如下:
<?php
$con=mysql_connect('127.0.0.1','root','');
var_dump($con);
sleep(10);
mysql_select_db('test',$con);
$cursor=mysql_query("select * from `timeout_test` where `id`=2 for update");
var_dump($cursor);
var_dump(mysql_fetch_assoc($cursor));
echo "done!";返回結果,mysql_connect 和mysql_query都返回false錯誤2)鎖阻塞測試
恢復正常的鏈接數,執行set autocomit=0; 我使用的是innodb引擎,myisam引擎沒有事務概念,autocomit的值在myisam下總為1。
在mysql鏈接中,執行語句:
mysql> select * from `timeout_test` where `id`=2 for update; +----+------+ | id | name | +----+------+ | 2 | kk | +----+------+ 1 row in set (0.00 sec)
resource(5) of type (mysql link)
bool(false)
Warning: mysql_fetch_assoc() expects parameter 1 to be resource, boolean given in D:\test\mysql-index\timeout.php on line 7
Call Stack:
0.0002 234472 1. {main}() D:\test\mysql-index\timeout.php:0
51.1252 242496 2. mysql_fetch_assoc() D:\test\mysql-index\timeout.php:7
NULL
done!PHP Warning: mysql_fetch_assoc() expects parameter 1 to be resource, boolean given in D:\test\mysql-index\timeout.php on line 7
PHP Stack trace:
PHP 1. {main}() D:\test\mysql-index\timeout.php:0
PHP 2. mysql_fetch_assoc() D:\test\mysql-index\timeout.php:7
mysql_query返回了false,此時如果強制使用mysql_fetch_assoc等獲取結果的函數,將會返回NULL
3)總結