【问题标题】:Mysql performance: How to store files tree in the database?Mysql 性能:如何在数据库中存储文件树?
【发布时间】:2011-04-28 10:37:23
【问题描述】:

我正在尝试将文件存储在数据库中并查询文件夹的数量和大小。我的表如下。

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

谢谢阿曼。

【问题讨论】:

  • 您是否需要真正不是 2048 大小的文件,或者它们可以大于 2048 但小于 2048?如果您的查询大小> 2048,那将大大加快它的速度。另外,您是在使用默认的 MySQL 配置还是尝试对其进行调整?
  • 文件系统非常擅长存储文件树;)
  • @Peter G.:目录是每个 du -hs 5 挂载的 nfs ???花费大约 20-25 分钟。
  • @Michael J.V.:是的,我需要所有不是目录的记录,例如:size>2048,但这并没有多大帮助。关于 my.cnf 调整第二次查询停留在缓存中,所以它需要几毫秒。

标签: mysql performance myisam


【解决方案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___%');

【讨论】:

  • 感谢您提供有趣的解决方案。不幸的是,它对性能没有帮助。查询状态显示处于:Sending Data阶段。
  • 看来我忘记为directory_id 设置索引了,这可能也有帮助。此外,您可以在directories 表中放置一个size 字段并在新的插入/删除时更新它 - 这将节省您执行SUM() 和对files 表的查询,这是假定的与directories 相比非常大。
猜你喜欢
  • 2011-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-12
  • 2011-01-06
  • 2012-03-13
  • 2012-03-17
  • 2016-05-18
相关资源
最近更新 更多