简单查询导致高数据库CPU使用率

时间:2013-11-15 23:14:36

标签: php mysql

我有以下简单的MySQL查询:

SELECT COUNT(*) FROM images WHERE path LIKE '%/path/to/image.jpg'

字段path有一个索引。表有大约500,000条记录。

虽然查询执行的时间不到一毫秒,但我正在观察MySQL棘轮的CPU使用率在进程列表中越来越高,即使这是唯一的查询。最终它攀升至99%。

脚本执行的唯一其他操作是递增一个简单的计数器,然后在数据库中不存在相应的条目时删除文件。

根据分析,PHP代码本身仅使用一小部分CPU(0.3%)。

我尝试将其降低到仅执行前5,000个,但脚本永远不会完成。我只看到一个空白页,尽管缓冲区刷新应该向我显示每25条记录的进度。

什么可能导致这种MySQL CPU使用量增加超过相同类型的超级简单查询?

3 个答案:

答案 0 :(得分:3)

  

字段路径有一个索引。

索引对于这样的查询是无用的。当LIKE参数包含变量postfix(LIKE 'something%')时,Btree索引只能与LIKE一起使用。它们不与变量前缀(LIKE '%something')一起使用。您可以查看EXPLAIN your_query_here,在那里您会看到该查询使用全表扫描。

所以答案是,你的MySQL在表格中搜索CPU(这个表很可能完全适合内存,所以它仍然非常快)。

答案 1 :(得分:1)

这种查询对于服务器来说并不简单。 在您的情况下,它会快速执行,因为它利用了完整的可用CPU时间。

考虑将'path'字段分别拆分为路径和文件名,它允许索引文件名并通过它进行搜索而不需要可变的后缀或前缀,希望它会减少按路径搜索的记录数量执行。

答案 2 :(得分:0)

您应该使用LOCATE代替:

... WHERE LOCATE('/path/to/image.jpg', path)

这将使用LIKE '%...'不会的索引。