標籤:
都知道通過在MySQL中執行select sleep(N)可以讓此語句運行N秒鐘:
[sql] view plain copy
- mysql> select sleep(1);
- +----------+
- | sleep(1) |
- +----------+
- | 0 |
- +----------+
- 1 row in set (1.00 sec)
返回給用戶端的執行時間顯示出等待了1秒鐘
藉助於sleep(N)這個函數我們可以在MySQL Server的PROCESSLIST中捕獲到執行迅速不易被查看到的語句以確定我們的程式是否確實在Server端發起了該語句。比如我們在調試時想確定一下程式是否確確實實向Server發起了執行SQL語句的請求,那麼我們可以通過執行show processlist或者由information_schema.processlist表來查看語句是否出現。但往往語句執行速度可能非常快,這樣的話就很難通過上述辦法確定語句是否真正被執行了。例如下面語句的執行時間為0.00秒,線程資訊一閃而過,根本無從察覺。
[sql] view plain copy
- mysql> select name from animals where name=‘tiger‘;
- +-------+
- | name |
- +-------+
- | tiger |
- +-------+
- 1 row in set (0.00 sec)
在這種情況下,可以通過在語句中添加一個sleep(N)函數,強制讓語句停留N秒鐘,來查看後台線程,例如:
[sql] view plain copy
- mysql> select sleep(1),name from animals where name=‘tiger‘;
- +----------+-------+
- | sleep(1) | name |
- +----------+-------+
- | 0 | tiger |
- +----------+-------+
- 1 row in set (1.00 sec)
同樣的條件該語句返回的執行時間為1.0秒。
但是使用這個辦法是有前提條件的,也只指定條件的記錄存在時才會停止指定的秒數,例如查詢條件為name=‘pig‘,結果表明記錄不存在,執行時間為0
[sql] view plain copy
- mysql> select name from animals where name=‘pig‘;
- Empty set (0.00 sec)
在這樣一種條件下,即使添加了sleep(N)這個函數,語句的執行還是會一閃而過,例如:
[sql] view plain copy
- mysql> select sleep(1),name from animals where name=‘pig‘;
- Empty set (0.00 sec)
另外需要注意的是,添加sleep(N)這個函數後,語句的執行具體會停留多長時間取決於滿足條件的記錄數,MySQL會對每條滿足條件的記錄停留N秒鐘。
例如,name like ‘%ger‘的記錄有三條
[sql] view plain copy
- mysql> select name from animals where name like ‘%ger‘;
- +-------+
- | name |
- +-------+
- | ger |
- | iger |
- | tiger |
- +-------+
- 3 rows in set (0.00 sec)
那麼針對該語句添加了sleep(1)這個函數後語句總的執行時間為3.01秒,可得出,MySQL對每條滿足條件的記錄停留了1秒中。
[sql] view plain copy
- mysql> select sleep(1),name from animals where name like ‘%ger‘;
- +----------+-------+
- | sleep(1) | name |
- +----------+-------+
- | 0 | ger |
- | 0 | iger |
- | 0 | tiger |
- +----------+-------+
- 3 rows in set (3.01 sec)
關於MySQL的SLEEP(N)函數