背景描述:資料庫使用的MySql,項目中有個裝置狀態記錄表,就是記錄裝置在某個時間下的各屬性狀態值。
系統下所有的裝置狀態記錄都會插入該表。
問題描述:現在情況是裝置有很多,每天就會插入很多條記錄。現在提供按裝置、按時間區間查詢記錄。現在表的資料較多,查詢起來速度較慢。
1.改如何最佳化呢?
2.網上看可以分表,現在打算按時間分表,那麼分表後如何按裝置、按時間查詢資料呢?
回複內容:
背景描述:資料庫使用的MySql,項目中有個裝置狀態記錄表,就是記錄裝置在某個時間下的各屬性狀態值。系統下所有的裝置狀態記錄都會插入該表。
問題描述:現在情況是裝置有很多,每天就會插入很多條記錄。現在提供按裝置、按時間區間查詢記錄。現在表的資料較多,查詢起來速度較慢。
1.改如何最佳化呢?
2.網上看可以分表,現在打算按時間分表,那麼分表後如何按裝置、按時間查詢資料呢?
一定要結合業務需求!一定要結合業務需求!一定要結合業務需求!
假設你沒有做索引,建議做個索引
舉例:假設你的商務邏輯大部分只查詢最近的裝置狀態記錄,那麼老的資料你單獨一張表,或者每月每年之類的一張表,取決於你資料大小
如果真需要按時間來分表的話,比如按每月來分的話,可以把表名設定為如201601,201602,...
再把每個表裡的裝置類型的欄位(假設欄位名為platform)設定索引,查詢的大致思路可以這樣:
$date = $_POST['date']; //查詢的時間,需處理為與表名規則一致$table = $date;$platform = $_POST['platform']; //查詢的裝置類型$where = "`platfrom`='$platform'";$query = "select * from $table $where";
也可以不用分表。mysql5.5之後可以嘗試下分區,按月分區或按年分區都可以。
你這查詢情況的話,可以分表;因為查詢條件有日期,所以按照日期分表查起來肯定不行(可能產生要在多個表裡查詢的情況),考慮到還有按照裝置來查詢;可以直接按照裝置(號)來分表,比如裝置的id,一萬個裝置的資料放入同一個表,或者一千個裝置放一個表,也就是說:裝置號/10000 結果整數部分一樣的一個表,查詢的時候就先根據擷取表名,然後在那個表裡查詢符合日期的範圍的結果