我有以下简单的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使用量增加超过相同类型的超级简单查询?
答案 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 '%...'
不会的索引。