MySQL 的 ORDER BY RAND()
是一種取得隨機資料庫條目的簡單方法。 然而,使用此方法檢索多個隨機行變得非常慢,尤其是對於大型資料集。
考慮此查詢旨在選擇 18 個隨機使用者設定檔:
<code class="language-sql">SELECT u.id, p.photo FROM users u, profiles p WHERE p.memberid = u.id AND p.photo != '' AND (u.ownership=1 OR u.stamp=1) ORDER BY RAND() LIMIT 18</code>
效率低下源自於ORDER BY RAND()
在應用LIMIT
子句之前對整個結果集進行排序的固有需求。
更有效的方法
卓越的策略利用索引列來顯著加快隨機選擇速度。 這是一個最佳化的查詢:
<code class="language-sql">SELECT g.* FROM table g JOIN (SELECT id FROM table WHERE RAND() < (SELECT 4 / COUNT(*) ) * 10 LIMIT 4) AS subquery ON g.id = subquery.id;</code>
最佳化說明
此修訂後的查詢包含多項關鍵改進:
RAND()
根據總行數的百分比來過濾行。 對 id
列(或 WHERE
子句中使用的任何欄位)建立索引可以快速識別行。 LIMIT
子句必須相同。 WHERE
條件,確保資料完整性。 此方法顯著減少了查詢執行時間,即使對於大量表格也是如此,為檢索多個隨機結果提供了更具可擴展性的解決方案。
結論
這些最佳化技術在處理 MySQL 中的隨機資料選擇時提供了顯著的效能提升。 透過避免 ORDER BY RAND()
,您可以建立更有效率、更健壯的資料庫應用程式。
以上是如何在不使用 ORDER BY RAND() 的情況下從資料庫中高效檢索多個隨機結果?的詳細內容。更多資訊請關注PHP中文網其他相關文章!