簡體   English   中英

MySQL的。擁有一個包含1M條記錄的表,或者每條表有10個表100K條記錄,是否更好(性能)?

[英]MySQL. Is it better (performance) to have one table of 1M records, or 10 tables 100K records each?

這之前可能會被問到,但無論如何都是這種情況。

我有一個大表(在MySQL上使用InnoDB),這基本上是一個巨大的日志,沒有關系花哨的東西。

3個字段:Customer_ID,TimeStamp,Log_Data(這是一個微小的文本,如“訪問過的網頁”或“登錄”)。

由於我在每天接收大約10,000個用戶的網頁中記錄客戶端的活動,因此該表增長得非常快。

在特定的時刻,我想知道有多少客戶在網站上做了什么。

所以我正在運行以下查詢'SELECT DISTINCT Customer_ID FROM table;',並且我已經開始注意到隨着表變大,查詢需要更長時間,這非常好並且完全可以預期。 在一個給定時間,查詢開始花費超過5分鍾來完成。

我想找到一種更快的方式,所以我嘗試了這個。 假設我正在使用一個包含100萬行的表。 我開始將該表拆分為10個表,每個表100K個記錄。 然后我運行'SELECT DISTINCT Customer_ID FROM table;' 在每張桌子上,以及所有結果我只是'排序| uniq | wc'他們在命令行上並得到相同的結果。

令人驚訝的是,該方法花費的時間不到另一個執行的一半。

我自己幾乎已經回答了這個問題,10 * 100K表比1 * 1M表快,但也許我做錯了,可能更多是性能調優的問題或者因為表應該設計得很好無論大小。

讓我知道你的想法。

謝謝閱讀。

更新:這是我創建表的方式:

CREATE TABLE `mydb`.`mytable` (
 `Customer_ID` BIGINT( 20 ) UNSIGNED NOT NULL,
 `unix_time` INT( 10 ) UNSIGNED NOT NULL,
 `data` TINYTEXT NOT NULL,
KEY `fb_uid` ( `fb_uid` )
) ENGINE = INNODB DEFAULT CHARSET = utf8;

雖然您的100K * 10解決方案確實使查詢更快,但聽起來很難維護,可能不是最好的方法。

“桌子的設計應該表現不錯,無論大小”

當表格對於您正在使用的數據庫引擎而言太大時,您必須意識到這不可能是真的。

所以,你可以做什么? 解決方案可能涉及您對此數據運行的查詢類型。

  • 查詢上面是唯一使用此數據的查詢嗎?
  • 如果沒有,該表上還運行了哪些其他查詢?

這里的一條經驗法則是不存儲您不需要的數據。 另一個是以易於查詢的方式存儲數據 - 即使您確實需要1M行原始數據,您仍然可以將一些聚合數據(或元數據)存儲在另一個表中,例如每個customer_id的表。一天,這是在一天結束時計算的。

您需要一個 Customer_ID 開頭的索引, 使您的查詢更快。 如果您有一個只包含它的索引,那么它將無法以最佳方式使用它。 以下是如何創建它:

CREATE INDEX idx_cid ON table (Customer_ID)

您也可以直接從數據庫獲取計數:

SELECT COUNT(DISTINCT(Customer_ID)) FROM table

如果你想將它縮小到一段時間,那么你需要一個復合索引:

CREATE INDEX idx_ts_cid ON table (TimeStamp, Customer_ID)

那么上個月的查詢會是這樣的:

SELECT COUNT(DISTINCT(Customer_ID)) FROM table
WHERE TimeStamp BETWEEN "2011-03-01" AND "2011-04-01"

要添加到其他人,因為你說你沒有做任何“花哨的關系”,你可能還想考慮使用面向大量數據集(和簡單表)的數據庫解決方案。 MongoDB就是一個例子。

我應該補充說,只有數據庫模式的其余部分也非常大且非關系時,這才有意義:)

看來你沒有user_id字段的索引,或者一個用戶有很多行說400萬行中的一百萬。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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