2012-05-16 139 views
1

我最近寫了做它的工作,所有的數據被收集的調查申請。現在我必須分析數據,我有一些時間問題。 我必須找出有多少人選擇了什麼選項並顯示出來。優化的MYSQL COUNT ORDER BY查詢

我使用這個查詢,這確實做的工作:

SELECT COUNT(*) 
    FROM survey 
WHERE users = ? AND table = ? AND col = ? AND row = ? AND selected = ? 
GROUP BY users,table,col,row,selected 

由於明顯的「?」我使用MySQLi(在PHP中)在需要時獲取數據,但我擔心這導致它太慢了。

該表由上述的所有元素(+的唯一ID)和它們都是整數。 解釋一些領域: 每個調查分爲3或4個表格(大小從2x3到5x5)與1至10幸福等級選擇形式。 (問題都擺在桌面的右側和頂部,然後你回答其中的問題相交)

用戶 - 年齡組

表,行,列 - 選擇上述

解釋 - dooooh以上

解釋

現在隨着調查的完成以及表中約100萬條條目的查詢變得非常緩慢。有時需要3分鐘,有時(我猜)時間限制到期,你根本得不到任何數據。我也沒有訪問完整的數據庫,只是我的空「測試」之一,因爲負荷消費是有點偏執:S(和他的服務器似乎有點慢)

現在(初始文章後)我問題是:我故意留下索引,因爲在調查期間編寫了大量數據,這將是一個壞主意。但是由於目前還沒有新的數據進入,索引表的所有字段是否合理?索引從未超過10的整數有多少意義? (你可以猜到我沒有關於索引的線索)。我需要此表中的主要唯一ID嗎?我

我讀過的索引可能會幫助組,但只有當你由一個表中的第一列進行分組(因爲我的ID是第一,從我的角度來看,無用,我可以刪除它並獲得任何東西嗎?)

有另一種方式來寫我的查詢,將基本上做同樣的事情,但在較短的時間內?

感謝提前所有您的建議!

+1

我會毫無疑問地將索引添加到列:用戶,表,列,行和選定。這應該會縮短運行查詢所花費的時間。 –

回答

2

上的條目,你「GROUP BY」添加索引或做「WHERE」。因此,這是一個包含用戶,表格,列,行的索引,並在您的案例中進行選擇。

一些快速規則:

  • 結合領域有WHERE第一和GROUP BY最後一個元素。
  • 如果您有隻使用其中的一部分(如用戶,表,列和選擇),然後離開缺失值(行,在這個例子中)最近發佈的其他查詢。

不要使用太多的索引/索引,因爲每個索引/索引都會減慢表的更新速度 - 所以在真正需要使用索引來平衡查詢的大型系統上。


編輯:你需要GROUP BY用戶,col,row,因爲這些用在WHERE中。如果WHERE已經將它們過濾出來,則只需按「選擇」即可。

+0

我可以通過如下方式獲得任何收益: – user1398269

+0

感謝您的幫助。我可以通過將查詢重寫爲類似的東西來獲取任何內容:SELECT selected,COUNT(selected)WHERE ....並讓php循環將它們回顯出來。那麼索引不再適用了嗎? (它們確實在頁面上一個接一個出現)。 (在這個論壇上的轉換輸入事件上的史詩級失敗:D) – user1398269

+0

如果您需要全部,SELECT用戶,表,列,列,選中,COUNT(*)FROM調查GROUP BY用戶,表,列,行,選擇是你最好的選擇(與指數),並會加快很多事情。循環所有結果。 – Robbie