2011-10-07 48 views
0

我目前正在評估存儲供應商目錄的策略。 目錄中可能有多個項目,從100到0.25百萬不等。 每個項目可能有多個錯誤。應用程序應該支持的目錄項如何在海量數據上創建索引(mysql)

  • 集團瀏覽由錯誤,類別,製造商,供應商等類型..
  • 瀏覽項目的任何一組,應該能夠進行排序和多列(PARTID搜索, 名稱,價格等)。

問題是當我必須提供「多搜索和排序和組」功能我應該如何創建索引。

根據mysql文檔&索引博客似乎在單個列上創建索引不會被所有查詢使用。

創建多列索引甚至不是特定於我的情況。

有可能是20 - 30組合搜索&排序。

我如何擴展以及如何快速搜索。

預計處理5000萬條記錄的數據。

目前正在對1500萬個數據進行評估。

建議歡迎。

CREATE TABLE CATALOG_ITEM 
(
    AUTO_ID BIGINT PRIMARY KEY AUTO_INCREMENT, 
    TENANT_ID VARCHAR(40) NOT NULL, 
    CATALOG_ID VARCHAR(40) NOT NULL, 
    CATALOG_VERSION INT NOT NULL, 
    ITEM_ID VARCHAR(40) NOT NULL, 
    VERSION INT NOT NULL, 
    NAME VARCHAR(250) NOT NULL, 
    DESCRIPTION VARCHAR(2000) NOT NULL, 
    CURRENCY VARCHAR(5) NOT NULL, 
    PRICE DOUBLE NOT NULL, 
    UOM VARCHAR(10) NOT NULL, 
    LEAD_TIME INT DEFAULT 0, 
    SUPPLIER_ID VARCHAR(40) NOT NULL, 
    SUPPLIER_NAME VARCHAR(100) NOT NULL, 
    SUPPLIER_PART_ID VARCHAR(40) NOT NULL, 
    MANUFACTURER_PART_ID VARCHAR(40), 
    MANUFACTURER_NAME VARCHAR(100), 
    CATEGORY_CODE VARCHAR(40) NOT NULL, 
    CATEGORY_NAME VARCHAR(100) NOT NULL, 
    SOURCE_TYPE INT DEFAULT 0, 
    ACTIVE BOOLEAN, 
    SUPPLIER_PRODUCT_URL VARCHAR(250), 
    MANUFACTURER_PRODUCT_URL VARCHAR(250), 
    IMAGE_URL VARCHAR(250), 
    THUMBNAIL_URL VARCHAR(250), 
    UNIQUE(TENANT_ID,ITEM_ID,VERSION), 
    UNIQUE(TENANT_ID,CATALOG_ID,ITEM_ID) 
); 

CREATE TABLE CATALOG_ITEM_ERROR 
(
    ITEM_REF BIGINT, 
    FIELD VARCHAR(40) NOT NULL, 
    ERROR_TYPE INT NOT NULL, 
    ERROR_VALUE VARCHAR(2000) 
); 
+0

我認爲我們需要db模式來回答這個問題。 – llazzaro

+0

用獅身人面像從頭開始 – Pentium10

+0

請找到表格定義 –

回答

0

如果您決定僅在MySQL中完成此操作,那麼您應該創建適用於所有查詢的索引。如果有20-30個不同的查詢進行排序,那麼可以有20或30個索引。但是你可以用比它低得多的指標來做這件事。

您還需要計劃如何維護這些索引。我假設,因爲這是供應商目錄的數據不會有太大變化。在這種情況下,簡單地創建你需要的所有索引應該很好地完成這項工作。如果數據行將被實時編輯或插入,那麼你必須考慮到你的索引 - 那麼有20或30個索引可能不是一個好主意(因爲MySQL將不斷地更新它們) 。您還必須考慮使用哪個MySQL存儲引擎。如果你的數據永不改變,MyISAM(默認引擎,基本上是快速平面文件)是一個不錯的選擇。如果它改變很多,那麼你應該使用InnoDB,這樣你可以獲得行級鎖定。 InnoDB也允許你定義一個聚集索引,這是一個控制磁盤上存儲的訂單的特殊索引。因此,如果您有99%的時間運行某個特定查詢,則可以爲其創建聚簇索引,並且所有數據在磁盤上都將以正確的順序排列,並且會以超級快的速度返回。但是,每次插入或更新數據都會導致整個表在磁盤上重新排序,這對大量數據來說並不快。如果數據經常更改,則永遠不會使用一個數據庫,並且您可能不得不批量加載數據更新(如供應商的百萬行的新版本)。同樣,這也取決於您是否會不時更新它,現在或者是不斷地實時更新它。

最後,你應該考慮替代方法,而不是在MySQL中這樣做。現在有很多非常好的搜索產品,例如Apache Solr或Sphinx(在上面的評論中提到),這可以讓您的生活在編碼自己的搜索界面時變得更加輕鬆。您可以在其中一個目錄中編制索引,然後使用它們提供一些非常棒的搜索功能,如全文和/或分面搜索。這就像有一個私人的谷歌搜索引擎索引你的東西,是一個很好的方式來描述這些工作。編寫代碼與搜索服務器進行交互需要花費一些時間,但是您很可能會節省時間,而不必編寫頭部索引以及上面提到的其他問題。

如果您只是想創建所有索引,請學習如何在MySQL中使用EXPLAIN命令。這將讓你看到MySQL執行查詢的計劃是什麼。您可以創建索引,然後在您的查詢中重新運行EXPLAIN並查看MySQL將如何使用它們。通過這種方式,您可以確保每個查詢方法都具有支持它的索引,並且不會退回到掃描整個數據表以查找內容。對於所討論的行數,每個查詢必須能夠使用索引來查找其數據。如果你得到的是正確的,它會表現良好。

+0

我明白你的觀點。我對錯誤管理和項目版本控制有一定的交易要求。 InnoDB將要求這樣做。 SPHINX需要MyISAM。 Apache Solr作爲獨立服務器,我已經在評估。 thnx您的建議。 –