N+1 Query

在 ORM 架構下常見問題。可使用 JOIN 解決

ORDER BY RAND()

在大型表格中隨機取出一筆資料的效能問題

SELECT * FROM products ORDER BY RAND() LIMIT 1;

這樣做會導致 mysql 生成 n 個亂數並且排序後取出一個。

假設存在一個欄位 c 是平均分佈,只要生成一個亂數 x 介於 min(c) 到 max(c),並取出 c >= x ,對 C 欄位排序後的第一筆,就可以快速產生。

加權 RAND 的做法

利用上面的方法,讓他的值不是平均分布,而是你希望的分布。

利用累進的概念,比方說:

稀有度 累進值
SSR 1
SR 5
R 20
N 100

可以取一個介於 1 到 100 的亂數,從上表中找出累進值 >= 亂數的值,這樣做的話就會發現結果跟存了 100 個 row 相同。

  • 亂數介於 0 到 1 代表抽到 SSR
  • 亂數介於 2 到 5 代表抽到 SR
  • 亂數介於 5 到 20 代表抽到 R
  • 亂數介於 20 到 100 代表抽到 N

LIMIT n, 20

LIMIT 100000, 20 時 mysql 會找出 100000 筆資料,然後傳回最後 20 筆 超慢

可以使用 id 或 timestamp 的值,表示讀到哪一頁,下一頁就可以從那個頁面繼續讀 不要讓 user 直接輸入頁面數做查詢

例子: http://blog.gslin.com/search?updated-max=2012-06-24T23:15:00%2B08:00&max-results=10

results matching ""

    No results matching ""