![](/img/trans.png)
[英]Default sort-ordering in MySQL (ALTER TABLE … ORDER BY …;)
[英]Ensure certain default sort order in MySql table
我有一個超過1100萬行的大型MySql表。 這只是一個巨大的數據集,我的任務是能夠根據某些規則分析數據集。
每行都屬於某個category
。 有200萬個不同類別。 我想獲取一個類別的所有行並對其執行操作。
因此,目前,我執行以下操作:
category
= category中選擇字段 即使我的category
列已建立索引,執行Step 2
仍需要花費很長時間。 這主要是由於龐大的數據集。
另外,我可以使用GROUP BY子句,但是我不確定它是否會那么快,因為在如此龐大的數據集上GROUP BY可能會很昂貴,尤其是考慮到要對部分數據集進行多次分析時,尤其如此。 永久確保排序表的方法將很有用。
因此,如果僅按category
表進行預排序,則可以加快查詢速度。 現在,我可以逐行讀取表並以更快的速度執行相同的操作,因為將連續獲取一個category
所有行。
由於數據集(MySql表)是固定的,並且不會對其進行更新,刪除,插入操作。 我希望能夠確保一種按category
維護默認排序順序的方法。 任何人都可以提出一個技巧來確保行的默認排序順序。
也許讀取所有行並將它們重寫到新表中,或者添加新的主鍵來確保此順序?
即使我的類別列已建立索引
通過二級索引編制索引? 如果這樣,您可能會遇到以下性能問題:
WHERE category = whatever
)仍可能最終加載許多表頁面。 這會破壞范圍掃描性能。 除了二級索引,請考慮使用自然主鍵,該主鍵在InnoDB表中還充當集群鍵。 主/集群鍵(例如{category, no}
將使同一類別的行在物理上保持緊密排列,從而使您的兩個查詢(尤其是第二個查詢)都具有最大的效率。
OTOH,如果要保留二級索引,請考慮覆蓋您查詢的所有字段,因此根本不必觸摸一級B樹。
您可以通過執行類似(偽代碼)的操作,一步一步地執行此操作,而無需編制索引:
Declare @LastCategory int = Null
Declare @Category int
For Each Row In
Select
@Category = Category,
...
From
Table
Order By
Category
If @LastCategory Is Null Or @LastCategory != @Category
Do any "New Category Steps"
Set @LastCategory = @Category
End
Process Row
End For
使用類別索引,我希望它執行正常。 您的性能問題可能歸結於您在處理每一行時正在做的事情。
這是一個示例: http : //sqlfiddle.com/#!2/e53c98/1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.