簡體   English   中英

MySQL + PHP:如何在用戶選擇的列上使用ORDER BY對復雜查詢中的數據進行分頁

[英]MySQL+PHP: How to paginate data from complex query with ORDER BY on user-selected column

我有一張目前有約1500行的表,該表預計會隨着時間的增長而增長(無法說出多少,但仍然如此),該網站是只讀的,可以讓用戶通過使用某些表格來進行復雜的查詢,然后進行搜索因為它是一個公共數據庫,所以查詢完全是URL編碼的。 重要的是要知道用戶可以選擇必須對哪些列數據進行排序

我並不擔心放置一些索引並放慢INSERT和UPDATE(只是偶爾由管理員執行),因為它的閱讀量很大,但是我需要對結果進行分頁,因為一些流行的查詢可以返回900多個結果,這會占用太多時間客戶端的空間和RAM(對結果進行進一步處理,以創建一個非常豐富的<div> HTML元素,其中每個結果均帶有<img>,btw)。

  • 我知道OFFSET {$m} LIMIT {$n}但想避免
  • 我知道這個的用法

詢問

SELECT *
FROM table
WHERE {$filters} AND id > {$last_id}
ORDER BY id ASC
LIMIT {$results_per_page}

這就是我要使用的內容,但這要求行僅按其ID排序!

  • 我提出了(我認為是)非常類似於自定義排序結果的查詢,並允許有效的分頁。

查詢:

SELECT *
FROM table
WHERE {$filters} AND {$column_id} > {$last_column_id}
ORDER BY {$column} ASC
LIMIT {$results_per_page}

不幸的是,這需要在頁面之間傳遞{$ last_column_id}值!

我知道索引(尤其是唯一索引)基本上是自動更新的基於整數的列,這些列通過列的值(例如整數,varchar等)對表進行“排名”,但是我真的不知道如何使MySQL返回該查詢有效所需的$ last_column_id!

我唯一能想到的是在用戶可以對結果進行排序的每個“ XYZ”列旁邊放置一個附加的“ XYZ_id”整數列,然后通過一些腳本定期更新值,但這是使其唯一起作用的唯一方法嗎? 請幫忙。

(太多注釋無法放入“注釋”。)

查詢I / O是否綁定? 還是受CPU約束? 似乎只有1500行會導致受CPU限制並且足夠快。

您正在使用什么引擎? 多少內存? 什么是設置key_buffer_sizeinnodb_buffer_pool_size

讓我們看看SHOW CREATE TABLE 如果表中充滿了大的BLOBsTEXT字段,那么我們需要對查詢進行編碼,以避免獲取那些笨拙的字段,只是因為OFFSET而把它們扔掉了。 提示:獲取LIMIT ID, 然后返回表以獲取大列。

唯一有效的方法是:

SELECT ...
    WHERE x = ...
    ORDER BY y
    LIMIT 100,20

將具有INDEX(x,y) 但是,即使那樣,仍然必須超過100個奶牛場。

您暗示存在許多可能的WHEREORDER BY子句? 這是否意味着添加足夠的索引以涵蓋所有情況可能不切實際?

“記住您離開的地方”比使用OFFSET更好,因此請嘗試這樣做。 這樣可以避免已經討論過的OFFSET問題。

不要使用WHERE (a,b) > (x,y) ; 該結構過去無法進行優化。 (也許5.7已修復它,但我不知道。)

我在OFFSET上的博客討論了您的問題。 (但是,它可能會也可能不會幫助您的特定情況。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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