[英]Performance implications of mysql_data_seek
我已經開始使用mysql_data_seek()作為通過將指針移動並讀取當前“頁面”將分頁透明地滾動到數據庫類中的簡便方法。
這樣做對性能有何影響? 我只是將所需的數據讀入PHP本身,但是在大多數情況下,SELECT會覆蓋整個表-這不好嗎,我會遇到海量表的問題嗎?
records in the table, then skip the first n*page records with mysql_data_seek() in order to "get to" the current page and read n records. 如果我理解您的想法,則選擇表中的記錄,然后使用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()必須接收下一條記錄從服務器。 of them for request that sounds a bit suboptimal. 如果您有很多記錄,並且對於聽起來不太理想的請求,都必須轉移記錄。
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
子句會更有效(它肯定會至少節省查找時間),但是我不知道mysql_data_seek
如何工作的內部原理,特別是如果它讀取x
記錄並丟棄它們,或者是否像文件系統seek
命令一樣工作(向MySQL發送信號,告訴它跳過發送下一個x
記錄)。
如果它能以第一種方式起作用,我希望這樣做的速度會最小。 如果是第二種方法,我希望可以加快速度,但是不如簡單地使用適當的LIMIT
子句那么LIMIT
。
唯一需要擔心的是表的大小。
基本上,您需要權衡以下因素:
如果您的應用程序意味着用戶不經常訪問第一或第二頁,那么您就不必要地存儲大量數據。 OTOH,如果您的用戶傾向於訪問所有頁面,並且訪問量很多(並且每次訪問都不會啟動新的頁面請求/結果集,即您正在使用動態分頁或某些半永久服務器端存儲容器),然后將結果集放在一個位置就可以了,特別是如果結果集在多個用戶之間緩存時。
但是,除非您已將其構建到架構中,否則最好使用類似
...LIMIT 10,10
...LIMIT 20,10
等等),並遭受多個數據庫命中,以避免不得不讀取比您需要更多的數據,並不必要地進行存儲。
如果查詢執行的成本很高,我將使用mysql_seek_data()。
通常,分頁需要兩個查詢執行ref:[ MySQL的分頁而不進行雙重查詢? ]
a)執行查詢以查找返回的記錄總數
b)使用limit子句執行查詢以僅獲取所需結果
對於第二種情況,請檢查問題:
如果查詢執行成本很高,我將不進行第二次執行,而選擇mysql_seek_data()函數,因為我已經成功使用了它
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.