簡體   English   中英

確保MySql表中的某些默認排序順序

[英]Ensure certain default sort order in MySql table

我有一個超過1100萬行的大型MySql表。 這只是一個巨大的數據集,我的任務是能夠根據某些規則分析數據集。

每行都屬於某個category 有200萬個不同類別。 我想獲取一個類別的所有行並對其執行操作。

因此,目前,我執行以下操作:

  1. 從表中選擇不同的類別。
  2. 對於每個類別:從表WHERE category = category中選擇字段

即使我的category列已建立索引,執行Step 2仍需要花費很長時間。 這主要是由於龐大的數據集。

另外,我可以使用GROUP BY子句,但是我不確定它是否會那么快,因為在如此龐大的數據集上GROUP BY可能會很昂貴,尤其是考慮到要對部分數據集進行多次分析時,尤其如此。 永久確保排序表的方法將很有用。

因此,如果僅按category表進行預排序,則可以加快查詢速度。 現在,我可以逐行讀取表並以更快的速度執行相同的操作,因為將連續獲取一個category所有行。

由於數據集(MySql表)是固定的,並且不會對其進行更新,刪除,插入操作。 我希望能夠確保一種按category維護默認排序順序的方法。 任何人都可以提出一個技巧來確保行的默認排序順序。

也許讀取所有行並將它們重寫到新表中,或者添加新的主鍵來確保此順序?

即使我的類別列已建立索引

通過二級索引編制索引? 如果這樣,您可能會遇到以下性能問題:

  • InnoDB表總是聚集在簇表中的次級索引都需要一個雙查找 (見“集群的缺點” 這篇文章 )。
  • 索引行可以散布在各處(索引可能具有不良的聚類因素 -鏈接適用於Oracle,但原理相同)。 如果是這樣,即使實際使用索引並且實際上只選擇了一小部分行,索引范圍掃描(例如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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM