簡體   English   中英

mysql_data_seek的性能影響

[英]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. 如果您有很多記錄,並且對於聽起來不太理想的請求,都必須轉移記錄。
the current subset with only one query. 我想您想通過一個查詢來獲取記錄總數當前子集總數。 使用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

我以為在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM