0

我需要帮助优化 Mysql 查询:

我有两张桌子:

jos_mp3_file(id,path,version_timestamp)

jos_mp3_licenses(id,s3_url,cdate)

每个大约有 20,000 条记录。

“jos_mp3_file.path ”列中的记录,可能在文件前面有一个文件夹,如下所示:'folder/file1.mp3'

我需要做的是找到所有记录,其中:1. “jos_mp3_file.path”与“ jos_mp3_licenses.mp3_url 具有相同的文件名(以某种方式通过文件夹部分)2. “jos_mp3_file.version_timestamp”大于jos_mp3_licenses。 cdate(都是日期时间数据类型)

到目前为止,我有这个查询,但由于某种原因,它需要很长时间才能运行(5-10 分钟)

SELECT jos_mp3_licenses.s3_url, jos_mp3_licenses.cdate,  jos_mp3_file.path,jos_mp3_file.version_timestamp
FROM jos_mp3_file, jos_mp3_licenses 
WHERE SUBSTRING_INDEX( jos_mp3_file.path , '/', -1 ) = jos_mp3_licenses.mp3_url
AND unix_timestamp(jos_mp3_file.version_timestamp) > unix_timestamp(jos_mp3_licenses.cdate) 

谢谢 !

4

1 回答 1

1

您的查询需要很长时间才能运行,可能是因为它正在执行嵌套循环连接。也就是说,它将一个表中的每条记录与另一个表中的每条记录进行比较。有 20k 行,这就是 4 亿次操作。

通常,当连接表时,您希望对一个或多个字段执行相等操作。尽管您的字段具有相等性,但我推测SUBSTRING_INDEX()出于优化目的而忽略了该函数。

最好的建议是将您想要的名称提取到表中的新列中。这将允许优化查询。然后,您可以通过在该列上添加索引来获得更好的性能。

我还建议将两个日期时间值的 unix_timestamp 也添加为单独的列。如果您随后使用文件名和适当日期的 unix 时间戳在两个表上构建索引,您应该有一个高度优化的查询。

于 2012-09-16T17:16:00.177 回答