最近遇到一個問題,就是在高並發下,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:7mysql_query返回了false,此時如果強制使用mysql_fetch_assoc等獲取結果的函數,將會返回NULL
3)總結