[英]How to speed up queries to a huge MySQL database (6m+ rows)
作為項目的一部分,我一直在從現場部署的許多傳感器收集數據。 這樣做的目的是了解設備的性能以及可能存在的任何潛在問題或錯誤。
我將數據存儲在數據庫中的單個表中,其中包含 id(primary)、MAC_address、name、status、timestamp 列。
MAC_address 是保證物理設備始終相同的一件事,這是我主要用於從數據庫中提取信息的內容。
我的目標是能夠在特定時間段內為特定設備提取數據,其 MAC_address 可以從下拉列表中選擇。 即使執行單個 SELECT DISTINCT 查詢來獲取唯一 MAC 地址列表也需要花費很長時間,但為該列創建索引似乎可以加快速度。 但是,現在從數據庫中提取任意數量的完整行仍然需要 30 秒以上的時間。
加速來自如此大數據庫的查詢的最佳方法是什么?
單桌……錯了。
一張表格描述了每個“設備”(或“傳感器”)。 它有一個id
,可能是一個 2 字節的SMALLINT UNSIGNED
(范圍為 0..65K——你不會有更多的傳感器嗎?)。 請注意 MAC_address 和 name 屬於此表。 此id
用於另一個表...
另一個表包含sensor_id
、 timestamp
和value
。 這個表應該有PRIMARY KEY(sensor_id, timestamp)
並且是 ENGINE=InnoDB`。 現在,在一段時間內查找一個傳感器的所有讀數非常有效。
這完全避免了SELECT DISTINCT
因為第一個表中沒有重復。
如果你有一個下拉,那么TINYINT UNSIGNED
(1-byte, 0..255) 可能很大。
好的,我已經幫助您完成了兩個SELECTs
; 你還有什么其他的。 請記住,性能主要取決於您需要觸摸的行數。 這包括你拒絕的那些。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.