簡體   English   中英

GROUP BY和ORDER BY太慢了。 怎么做得更快?

[英]GROUP BY and ORDER BY too slow. How to make faster?

我試圖為我的表創建一些統計數據,但它有超過300萬行,所以它真的很慢。

我正在嘗試找到列name最受歡迎的值,並顯示它彈出的次數。

我正在使用這個,但它不起作用,因為它太慢,我只是得到錯誤。

    $total = mysql_query("SELECT `name`, COUNT(*) as b FROM `people` GROUP BY `name` ORDER BY `b` DESC LIMIT 0,5;")or die(mysql_error());

你可能會看到我正在嘗試獲取所有名稱以及該名稱已被使用了多少次,但只顯示前5名以希望加快它的速度。

我希望能夠獲得像這樣的價值觀

   while($row = mysql_fetch_array($result)){
        echo $row['name'].': '.$row['b']."\r\n";
   }

它會顯示這樣的事情;

  Bob: 215
  Steve: 120
  Sophie: 118
  RandomGuy: 50
  RandomGirl: 50

我不太關心以后訂購名稱,如RandomGirl和RandomGuy是錯誤的方式。

我想我已經提供了足夠的信息。 :)我希望這些名稱盡可能不區分大小寫。 Bob應該與BoB,bOb,BOB等相同。

謝謝你的時間保羅

限制前5位的結果不會給你帶來很多加速,你會在結果檢索中獲得時間,但在mySQL方面,整個表仍然需要被解析(計數)。

您將加速在名稱列上具有索引的計數查詢,當然因為只解析索引而不是表。

現在,如果您真的想加快結果並避免在需要此結果時解析名稱索引(如果您確實有數百萬行,這仍然會很慢),那么唯一的其他解決方案是在插入,刪除時計算統計數據或更新此表上的行。 那就是在這個表上使用觸發器來維護這個附近的統計表。 那么你真的只在這個統計表上有一個簡單的選擇查詢,只解析了5行。 但是你會減慢插入,刪除和更新操作的速度(這已經非常慢,特別是如果你維護索引,所以如果統計數據很重要,你應該研究這個解決方案)。

你有名字索引嗎? 它可能有所幫助。

由於您正在進行計數/分組,然后對名稱上的索引進行排序並沒有幫助,MySql每次都應該遍歷所有行,沒有辦法優化它。 你需要有一個單獨的統計表,如下所示:

CREATE TABLE name_stats( name VARCHAR(n), cnt INT, UNIQUE( name ), INDEX( cnt ) )

每當你向'people'表添加一個新行時,你應該更新這個表,如下所示:

INSERT INTO name_stats VALUES( 'Bob', 1 ) ON DUPLICATE KEY UPDATE cnt = cnt + 1;

查詢此表以獲取頂級名稱列表應立即為您提供結果。

暫無
暫無

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

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