2009-07-02 157 views
1

我已經開始使用mysql_data_seek()作爲一種簡單的方法,通過移動指針並讀取當前的'頁面',將分頁透明地滾動到我的數據庫類中。mysql_data_seek的性能影響

這樣做的性能影響是什麼?我只是將需要的數據讀入PHP本身,但在大多數情況下,SELECT覆蓋整個表格 - 這是不好的,我會遇到大量表格的問題嗎?

回答

2

如果我理解你的想法,在表中選擇全部記錄,然後用mysql_data_seek()跳過第一個n *頁記錄,以便「進入」當前頁面並讀取n條記錄。如果你有很多記錄,你可能不想這樣做,因爲http://php.net/mysql_data_seek說:

注意:函數mysql_data_seek()只能與mysql_query()結合使用,而不能與mysql_unbuffered_query()一起使用
mysql_query()和沒有緩衝的版本是,mysql_query()只有在整個結果集已經從MySQL服務器複製到PHP進程的內存之後纔會返回,而在每個mysql_fetch_xyz()的非緩衝版本之後必須從服務器接收下一個記錄。如果你有很多記錄,你必須轉讓 所有其中 每個單一請求聽起來有點不理想。
我想你想這樣做只有一個查詢獲得當前子集的記錄總數 。用MySQL,你可以有兩個,一個LIMIT子句,記錄的總數(這將是在結果沒有LIMIT條款中),
SELECT SQL_CALC_FOUND_ROWS id FROM foo 
ORDER BY id LIMIT 20,10

看到http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_found-rows

1

我想,在你的SELECT語句中使用適當的LIMIT條款更有效(這肯定會節省查找時間ATLEAST),但我不知道怎麼怎麼mysql_data_seek作品的內部,特別是如果它讀取x記錄和丟棄它們,或者它是否像文件系統seek那樣工作(向MySQL發送一個信號,告訴它跳過發送下一個x記錄)。

如果它以第一種方式工作,我希望以這種方式進行最小化加速。如果是後面的方法,我希望有一個加速,但不像簡單地使用適當的LIMIT子句那樣多。

1

唯一要擔心的是表格大小。

基本上,你的代價是間:

  • 讀取整個表/結果到一個單一的結果集,節省往返到數據庫
  • 或進行多個一口大小的訪問數據庫,一個每頁

如果您的應用程序意味着用戶通常不會經過第一個或第二個頁面,那麼您將不必要地存儲大量的數據。 OTOH如果你的用戶傾向於訪問所有的頁面,並且有很多(每個頁面訪問不會啓動一個新的頁面請求/結果集,即你正在使用動態分頁或一些半持久的服務器端內存容器),那麼將結果集保存在一個地方是很好的,特別是如果它在多個用戶之間緩存的話。

但是,除非你已經建立了到您的架構,你可能在查詢中最好使用像

...LIMIT 10,10 

...LIMIT 20,10 

等雖然和痛苦的多個數據庫命中,以避免閱讀更多數據比你需要的更多,並且不必要地存儲它。

1

我會用mysql_seek_data去()如果查詢執行的成本很高。

通常分頁需要兩個查詢執行 參考:[MySQL pagination without double-querying?]

一個)執行查詢,以找到總沒有記錄返回

b)中執行與限制子句查詢以獲取只有期望的結果
對於第二種情況,請檢查問題:

如果查詢執行成本非常高,我不會去執行第二次執行,並選擇mysql_seek_data()函數,因爲我已經成功地使用它