2011-04-28 67 views
0

我試圖將文件存儲在數據庫中,並查詢文件夾的數量和大小。我的表格如下。Mysql性能:如何在數據庫中存儲文件樹?

CREATE TABLE `files` (
`permission` varchar(10) DEFAULT NULL, 
`size` int(11) NOT NULL DEFAULT '0' COMMENT 'filesize', 
`date` varchar(20) CHARACTER SET latin1 COLLATE latin1_general_ci DEFAULT NULL, 
`time` varchar(20) CHARACTER SET latin1 COLLATE latin1_general_ci DEFAULT NULL, 
`path` varchar(1024) CHARACTER SET latin1 COLLATE latin1_general_ci DEFAULT NULL, 
KEY `path` (`path`(10)), 
KEY `path_2` (`path`(4)), 
KEY `size` (`size`) 
) ENGINE=MyISAM 

我的文件夾就像「????/some string」。我有大約38,333,316條記錄。 簡單查詢大約需要22秒。

mysql> select count(*),sum(size)/(1024.0*1024.0*1024.0) from files 
where path like '5___%' and size != 2048; 
+----------+----------------------------------+ 
| count(*) | sum(size)/(1024.0*1024.0*1024.0) | 
+----------+----------------------------------+ 
| 7900746 |      9019.6535 | 
+----------+----------------------------------+ 
1 row in set (22.89 sec) 

mysql> explain select count(*),sum(size)/(1024.0*1024.0*1024.0) 
     from files where path like '5___%' and size != 2048; 
--+-----------+-----+----+-------------- -+----+-------+----+--------+----------- 
id|select_type|table|type|possible_keys |key |key_len|ref |rows | Extra  
--+-----------+-----+----+----------------+----+-------+----+--------+----------- 
1| SIMPLE |files| ALL|path,path_2,size|NULL|NULL |NULL|38333316|Using where 
--+-----------+-----+----+----------------+----+-------+----+--------+----------- 
1 row in set (0.23 sec) 

有沒有辦法優化查詢,我可以加快以某種方式? 通常我希望問類似這樣的一些問題:

path like '5___%' and size != 2048 
path like '3___%' and size != 2048 
path like '45__%' and size != 2048 

感謝阿曼。

+0

你需要的文件,真正是不是2048的大小,也可以是大於2048小於2048,但小嗎?如果你的查詢大小大於2048,會顯着加快速度。另外,你是使用默認的MySQL配置還是試圖調整它? – 2011-04-28 10:42:18

+1

文件系統在存儲文件樹方面非常出色;) – 2011-04-28 10:46:03

+0

@Peter G .:目錄是nfs,每個目錄都掛載-hs 5?花費約20-25分鐘。 – Arman 2011-04-28 10:58:04

回答

1

嘗試這樣:

CREATE TABLE `directories` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `path` varchar(1024) NOT NULL, 
    `permissions` varchar(10) NOT NULL, 
    `timestamp` datetime NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `path` (`path`(4)) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 

CREATE TABLE `files` (
    `directory_id` int(10) unsigned NOT NULL, 
    `filename` varchar(1024) NOT NULL, 
    `permissions` varchar(10) NOT NULL, 
    `timestamp` datetime NOT NULL, 
    `size` bigint(20) unsigned NOT NULL, 
    KEY `size` (`size`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 

SELECT COUNT(*), SUM(size)/1073741824 FROM files WHERE directory_id IN(SELECT group_concat(id SEPARATOR ',') FROM directories WHERE path LIKE '5___%'); 
+0

感謝您提供有趣的解決方案。不幸的是它對性能沒有幫助。查詢狀態顯示它在:發送數據階段。 – Arman 2011-05-02 06:54:00

+0

看來我忘記了爲'directory_id'設置索引,這可能也有幫助。另外,你可以在'directories'表中放一個'size'字段,並在新插入/刪除的時候更新它 - 這樣可以節省你執行SUM()和一個查詢到'files'表,與'目錄'相比應該是非常大的。 – Narf 2011-05-02 08:32:09

相關問題