如何更新~25,000个音乐文件的数据库?

时间:2011-10-22 11:06:05

标签: mysql database file

更新

我写了一个工作脚本,在合理的时间内完成这项工作,似乎非常可靠。它完全用PHP编码,围绕saccharine建议的array_diff()思想构建(所以,谢谢糖精!)。

您可以在此处访问源代码:http://pastebin.com/ddeiiEET

我有一个MySQL数据库,它是某个目录中mp3文件的索引及其属性(即标题/艺术家/专辑)。

新文件通常会添加到音乐目录中。目前它包含大约25,000个MP3文件,但是我需要创建一个每天都要通过它的cron作业,添加它在数据库中找不到的任何文件。

问题在于我不知道这样做的最佳/最不费力的方式是什么。我假设必须在每个 cron运行上运行每个文件的MySQL查询(以检查它是否已被索引),因此脚本将不可避免地需要一点点运行时(这是好的;这是一个自动化的过程)。但是,正因为如此,我通常的选择语言(PHP)可能还不够,因为它不是为了运行像这样的长时间运行的脚本(或者是......?)。

这显然会很好,但我不会因删除已删除文件的索引条目而感到困惑(如果文件实际被删除,它总是手动清理,我不介意只是手动进入数据库修复索引)。

顺便说一下,它会递归;这些文件大多位于Artist / Album / Title.mp3结构中,但是它们没有像这样的宗教顺序,并且脚本肯定必须能够为新文件获取ID3标签。实际上,理想情况下,我希望脚本在每次运行时为每个文件获取ID3标记,并向数据库添加新行或者如果已更改则更新现有的行。

无论如何,我从头开始用这个,所以我猜的最基本的建议(比如使用哪种编程语言 - 如果有必要,我愿意学习一个新的编程语言)。非常感谢!

2 个答案:

答案 0 :(得分:1)

首先是一个愚蠢的问题,是不是可以简单地按添加日期对文件进行排序,只运行在最后一天添加的文件的迭代?我对文件的处理并不是很熟悉,但它似乎应该是可能的。

如果您只想提高当前代码的速度,我建议您检查数据是否已正确编入索引。如果您搜索表的索引,它会使查询更快。如果您要搜索非关键列,则可能需要更改设置。您还应该避免使用“SELECT *”而改为使用“SELECT COUNT”,因为mysql将返回int而不是对象。

您也可以在一些mysql查询中执行所有操作,但会增加php代码的复杂性。使用有关所有文件$ files的信息调用该数组。从db中选择数据,其中db中的文件与$ files中的文件匹配。这样的事情。

"SELECT id FROM MUSIC WHERE id IN ($files)"

读取返回的数组并将其标记为$ db_files。然后使用array_diff()查找$ files数组中未出现在$ db_files数组中的所有文件。标记丢失的文件$ missing_files。然后将$ missing_files中的文件插入db。

答案 1 :(得分:0)

您使用的是哪种引擎?如果您使用的是MyISAM,则在更新表格时将锁定整个表格。但是,25k行并不是那么多,所以基本上(最大)几分钟它应该更新。如果它是InnoDB只是更新它,因为它的行级锁定,你应该仍然能够在更新它时使用你的表。

顺便说一句,如果您没有在该表上使用任何全文搜索,我相信您应该将其转换为InnoDB,因为您可以使用外部索引,这对您在加入表时会有很大帮助。此外,它更好地扩展AFAIK。

相关问题