我已經開始使用mysql_data_seek()作爲一種簡單的方法,通過移動指針並讀取當前的'頁面',將分頁透明地滾動到我的數據庫類中。mysql_data_seek的性能影響
這樣做的性能影響是什麼?我只是將需要的數據讀入PHP本身,但在大多數情況下,SELECT覆蓋整個表格 - 這是不好的,我會遇到大量表格的問題嗎?
我已經開始使用mysql_data_seek()作爲一種簡單的方法,通過移動指針並讀取當前的'頁面',將分頁透明地滾動到我的數據庫類中。mysql_data_seek的性能影響
這樣做的性能影響是什麼?我只是將需要的數據讀入PHP本身,但在大多數情況下,SELECT覆蓋整個表格 - 這是不好的,我會遇到大量表格的問題嗎?
如果我理解你的想法,在表中選擇全部記錄,然後用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()的非緩衝版本之後必須從服務器接收下一個記錄。如果你有很多記錄,你必須轉讓 所有其中 每個單一請求聽起來有點不理想。
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
我想,在你的SELECT
語句中使用適當的LIMIT
條款更有效(這肯定會節省查找時間ATLEAST),但我不知道怎麼怎麼mysql_data_seek
作品的內部,特別是如果它讀取x
記錄和丟棄它們,或者它是否像文件系統seek
那樣工作(向MySQL發送一個信號,告訴它跳過發送下一個x
記錄)。
如果它以第一種方式工作,我希望以這種方式進行最小化加速。如果是後面的方法,我希望有一個加速,但不像簡單地使用適當的LIMIT
子句那樣多。
唯一要擔心的是表格大小。
基本上,你的代價是間:
如果您的應用程序意味着用戶通常不會經過第一個或第二個頁面,那麼您將不必要地存儲大量的數據。 OTOH如果你的用戶傾向於訪問所有的頁面,並且有很多(每個頁面訪問不會啓動一個新的頁面請求/結果集,即你正在使用動態分頁或一些半持久的服務器端內存容器),那麼將結果集保存在一個地方是很好的,特別是如果它在多個用戶之間緩存的話。
但是,除非你已經建立了到您的架構,你可能在查詢中最好使用像
...LIMIT 10,10
...LIMIT 20,10
等雖然和痛苦的多個數據庫命中,以避免閱讀更多數據比你需要的更多,並且不必要地存儲它。
我會用mysql_seek_data去()如果查詢執行的成本很高。
通常分頁需要兩個查詢執行 參考:[MySQL pagination without double-querying?]
一個)執行查詢,以找到總沒有記錄返回
b)中執行與限制子句查詢以獲取只有期望的結果
對於第二種情況,請檢查問題:
如果查詢執行成本非常高,我不會去執行第二次執行,並選擇mysql_seek_data()函數,因爲我已經成功地使用它