mysql
  • performance
  • 2016-08-05 47 views 0 likes 
    0

    我有一個有幾百萬行的單個表,客戶端同時訪問這個表,每個客戶需要得到20個唯一的行,然後需要放在最後一行。爲多個客戶端同時提供獨特的結果

    我的設置是:

    表結構:

    id | last_access | reserved_id | [Data columns] 
    id + last_access is indexed 
    

    對於選擇我用下面的20個獨特的行:

    UPDATE "table" SET "reserved" = 'client-id_timestamp' WHERE "reserved" = ''ORDER BY "last_access" ASC LIMIT 20 
    

    此更新查詢是相當糟糕的表現明智的,這是我爲什麼要問:

    對我的具體要求有更好的解決方案嗎?另一個表結構也許?

    +0

    在列名稱周圍使用backtics而非引號 - 引號用於字符串。 –

    +0

    這只是一個例子,但無論如何指出。 – Jeppe

    回答

    1

    是last_access日期列?嘗試使用整數值表示它(即1970-01-01以來的秒數),排序可能會更快。

    第二個性能問題可能來自您在更改「reserved」字段後重新索引表的需求。如果從該列中刪除索引,性能可能會提高。雖然搜索需要更長的時間,但更便宜的重新索引被排除在外。

    如果您使用的是MySQL 5.6.3或更新版本,則可以使用查詢執行EXPLAIN以查明哪部分時間最長。

    +0

    實際上刪除保留列的索引,修復了一些性能問題,所以非常感謝! 我仍然認爲應該有更好的解決方案,就如何處理這種情況? 隨着行數增加,性能越來越差。 – Jeppe

    +0

    也許你可以在更詳細的描述中描述你想做什麼。爲什麼你必須通過上次訪問來訂購?爲什麼要限制20?也許這會有助於將數據列放在一個單獨的表格中,並將該表格保持在最低限度。 你也可以保留一個更短的表格(100k行)。當你訪問一個對象時,在這個「緩存」表中插入/更新它的行,並且有一個修剪機制在某個時間間隔刪除舊條目。 –

    +0

    請勿重新索引。儘管更新索引代價昂貴,因爲您正在更改索引中的值,但重建索引整個表的成本會更高。 –

    相關問題