Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 导致高数据库CPU使用率的简单查询_Php_Mysql - Fatal编程技术网

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

Php 导致高数据库CPU使用率的简单查询,php,mysql,Php,Mysql,我有以下简单的MySQL查询: SELECT COUNT(*) FROM images WHERE path LIKE '%/path/to/image.jpg' 字段path具有索引。这个表有大约500000条记录 虽然执行查询所需时间不到一毫秒,但我在进程列表中看到MySQL ratchet的CPU使用率越来越高,即使这是唯一的查询。最终上升到99% 脚本所做的另一件事是增加一个简单计数器,然后在数据库中不存在相应条目时删除一个文件 根据评测,PHP代码本身只使用了一点点CPU(0.3%)

我有以下简单的MySQL查询:

SELECT COUNT(*) FROM images WHERE path LIKE '%/path/to/image.jpg'
字段
path
具有索引。这个表有大约500000条记录

虽然执行查询所需时间不到一毫秒,但我在进程列表中看到MySQL ratchet的CPU使用率越来越高,即使这是唯一的查询。最终上升到99%

脚本所做的另一件事是增加一个简单计数器,然后在数据库中不存在相应条目时删除一个文件

根据评测,PHP代码本身只使用了一点点CPU(0.3%)

我试着把它放下,只做前5000个,但脚本永远不会结束。我只看到一个空白页,尽管缓冲区刷新应该每25条记录向我显示一次进度

与同类超简单查询相比,是什么导致这种MySQL CPU使用率增加

字段路径有一个索引

索引对于这样的查询是无用的。当LIKE参数包含变量后缀(
LIKE'something%'
)时,Btree索引只能与LIKE一起使用。它们不与变量前缀一起使用(
如“%something”
)。您可以在这里检查
解释您的查询,\u
,在那里您将看到查询使用全表扫描


所以答案是,MySQL会消耗CPU在表中搜索(很可能表完全放在内存中,所以它仍然非常快)。

这种查询对于服务器来说根本不简单。 在您的情况下,它执行得很快,因为它利用了全部可用的CPU时间


考虑将“path”字段分别拆分为path和filename,这样可以在不使用可变后缀或前缀的情况下为文件名编制索引并按其执行搜索,以减少按路径执行搜索的记录数。

您应该改为使用
LOCATE

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

这将在“%”等
无法使用的地方使用索引。

或存储路径的副本并将其反向索引。感谢您的提示!下次我需要为这种查询使用索引时,我会这样做。我很少使用LIKE,我从未意识到这种联系。谢谢你的澄清!