Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/248.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 如何优化这个mysql查询?关于nginx和fastcgi_Php_Mysql_Nginx_Fastcgi_Redbean - Fatal编程技术网

Php 如何优化这个mysql查询?关于nginx和fastcgi

Php 如何优化这个mysql查询?关于nginx和fastcgi,php,mysql,nginx,fastcgi,redbean,Php,Mysql,Nginx,Fastcgi,Redbean,我在nginx、fastcgi和mysql之上有一个基于代码点火器框架的web应用程序 我有一张付款表。表结构为 在该表中,存储了国家名称、许可证费用vs和近56373条记录 在主页中,有一个表单要求用户键入他的手机号码以获取许可费。顺便说一句,我使用的是自动完成功能,因为用户在 以下是我的后端代码: $str保存用户输入的手机号码 $ret=真; $count=3 这段代码让我可以从手机号码中获得许可费用。表中只包含前缀,而不是所有的手机号码 我对nginx和fastcgi做了一些修改,以扩展

我在nginx、fastcgi和mysql之上有一个基于代码点火器框架的web应用程序

我有一张付款表。表结构为

在该表中,存储了国家名称、许可证费用vs和近56373条记录

在主页中,有一个表单要求用户键入他的手机号码以获取许可费。顺便说一句,我使用的是自动完成功能,因为用户在

以下是我的后端代码:

$str保存用户输入的手机号码

$ret=真; $count=3

这段代码让我可以从手机号码中获得许可费用。表中只包含前缀,而不是所有的手机号码

我对nginx和fastcgi做了一些修改,以扩展超时限制

但当太多人同时使用该服务时,mysqld的cpu使用率将超过100%

如何改进此算法


谢谢。

我认为像“$sub%”这样的命令会比regex更快,如果它们在3个数字之前不自动完成,对您的数据库可能会更好


如果您将EXPLAIN放在该脚本之外的SQL开头,请发布一些示例SQL输出。

我认为类似“$sub%”的命令比正则表达式快,如果它们在3个数字之前不自动完成,对您的数据库可能更好


如果将EXPLAIN放在该脚本之外的SQL开头,请发布一些示例SQL输出。

您可以创建另一个表来存储前缀。例如,如果支出表中的一个条目的prefix=12345,则prefixTable将有5个关联行:1、12、123、1234和12345。每个条目都将通过外键链接到原始记录。要进行搜索,您需要在prefixTable中找到一个精确匹配项,然后连接回您的支出表以获取支出信息


这当然会占用服务器上更多的空间,但会显著提高速度。

您可以创建另一个表来存储前缀。例如,如果支出表中的一个条目的prefix=12345,则prefixTable将有5个关联行:1、12、123、1234和12345。每个条目都将通过外键链接到原始记录。要进行搜索,您需要在prefixTable中找到一个精确匹配项,然后连接回您的支出表以获取支出信息

这当然会占用服务器上更多的空间,但会显著提高速度。

将前缀列从文本转换为具有所需最小长度的VARCHAR列,并在前缀列上添加索引

然后,不要使用正则表达式,而是将LIKE与%通配符一起使用:

SELECT Destination, PerMinuteCost
FROM `payout` WHERE `Prefix` LIKE '$sub%'
LIMIT 0 , 30
将前缀列从TEXT转换为具有所需最小长度的VARCHAR列,并在前缀列上添加索引

然后,不要使用正则表达式,而是将LIKE与%通配符一起使用:

SELECT Destination, PerMinuteCost
FROM `payout` WHERE `Prefix` LIKE '$sub%'
LIMIT 0 , 30


正则表达式是自动完成的吗?因为我会立即删除它。这是我的快速生产代码。现在我正在搜索优化。你能发布一个用户输入的示例吗?你是否建议他们先键入“0”然后键入“01”然后键入“012”?例如,用户键入905303818191。他们键入电话号码以获取payoutrate。如果不更改标题,我无法编辑你的帖子,因为已经有一百万篇帖子的标题是如何优化此mysql查询?。这表明你的头衔被打破了。请把它修好!还有,几个大写字母是否要求太多…?正则表达式是否表示自动完成?因为我会立即删除它。这是我的快速生产代码。现在我正在搜索优化。你能发布一个用户输入的示例吗?你是否建议他们先键入“0”然后键入“01”然后键入“012”?例如,用户键入905303818191。他们键入电话号码以获取payoutrate。如果不更改标题,我无法编辑你的帖子,因为已经有一百万篇帖子的标题是如何优化此mysql查询?。这表明你的头衔被打破了。请把它修好!此外,几个大写字母是否要求太多…?同时为表单中最后输入的值添加某种缓存可能会加快大多数常见搜索的速度nginx与MySQL有什么关系?MySQL在使用LIKE进行前缀搜索时可以使用索引。应用程序级缓存会带来缓存失效问题,除非有证据表明它有显著的好处,否则应该避免。此外,为表单中最后输入的值添加某种缓存可能会加快大多数常见搜索的速度nginx与MySQL有什么关系?MySQL可以在使用LIKE作为前缀时使用索引搜索应用程序级缓存会带来缓存失效问题,除非有证据表明有显著的好处,否则应该避免。如果它们都是长度相同或相似的数字,则您可能只需要在varchar上加一个int列,因为所有varchar行最终都存储为数据len
最长入口的gth。另外,除非需要空格,否则您不会希望错误地在中输入字符?@tristanbailey,VARCHAR值不会存储为最长条目的数据长度。对于索引来说甚至都不是这样。VARCHAR列使用前一到两个字节来存储每行的值长度。余数实际上是可变长度,与值匹配。如果它们都是相同长度或类似长度的数字,您可能只需要在varchar上加一个int列,因为所有varchar行最终都存储为最长条目的数据长度。另外,除非需要空格,否则您不会希望错误地在中输入字符?@tristanbailey,VARCHAR值不会存储为最长条目的数据长度。对于索引来说甚至都不是这样。VARCHAR列使用前一到两个字节来存储每行的值长度。余数实际上是可变长度,与值匹配。