【问题标题】:performance issue from 5 queries in one page一页中 5 个查询的性能问题
【发布时间】:2018-03-13 11:32:24
【问题描述】:

由于我是一名初级 PHP 开发人员,日复一日地陷入了此处描述的性能问题: 我正在用 PHP 制作一个搜索引擎,我的数据库有一个包含 41 列和数百万行的表,显然它是一个非常大的数据集。在index.php 我有一个用于搜索数据的表单。当用户输入搜索关键字并点击提交时,操作是在search.php 上显示结果。查询是这样的。

SELECT * FROM TABLE WHERE product_description LIKE '%mobile%' ORDER BY id ASC LIMIT 10

这是第一个查询。结果显示后我必须像这样运行 4 个其他查询:

SELECT DISTINCT(weight_u) as weight from TABLE WHERE product_description LIKE '%mobile%'
SELECT DISTINCT(country_unit) as country_unit from TABLE WHERE product_description LIKE '%mobile%'
SELECT DISTINCT(country) as country from TABLE WHERE product_description LIKE '%mobile%'
SELECT DISTINCT(hs_code) as hscode from TABLE WHERE product_description LIKE '%mobile%'

这些查询是针对过滤器的,问题是当我提交搜索按钮时,所有查询都在以性能问题为代价同时运行,它非常慢。
有没有其他方法可以获取weight,country,country_unit,hs_code speeder 或者如何实现。

这里实现了相同的功能,表格填充数据后过滤栏在哪里,我如何实现它。请帮助

Full Functionality implemented here.

我试图解释我的全部问题,如果有任何错误,请告诉我我会改进这个问题,我也是stackoverflow的新手。

【问题讨论】:

  • 前导 '%' 表示它必须查看 每一 行。 5 次!

标签: php mysql performance filter


【解决方案1】:

首先 - 您确定此代码按预期工作吗?第一个查询检索 10 条与您的搜索词匹配的记录。这些记录可能有重复的 weight_ucountry_unitcountryhs_code 值,因此当您为过滤器执行接下来的 4 个查询时,您完全有可能获得返回的值 不是 在第一个查询中,因此过滤器可能没有意义。

如果这是真的,我会在您的客户端代码 (PHP) 中创建过滤器值 - 查找 10 条记录中的唯一值将变得快速而简单,并减少数据库往返次数。

最后,您可以做出的最大改进是使用 MySQL 的fulltext searching 功能。您的应用程序运行缓慢的原因是您的搜索词不能使用索引 - 您在开头和结尾都使用通配符。这就像在电话簿中搜索姓名中包含“ishra”的人 - 您必须查看每条记录以检查匹配项。全文搜索索引就是为此而设计的——它们也有助于模糊匹配。

【讨论】:

  • 是的先生,我正在我的项目中实现全文索引。我很困惑如何实现最后在给定链接中实现的过滤器。不要检查我的查询,这些只是为了理解。给我一些提示如何实现以下链接中的功能?,我也编辑了问题
  • 好的 - 那么您是否想要检索一堆与搜索词匹配的记录,并使用过滤选项显示匹配记录的名称和数量?
  • 是的。请访问我提供的链接我想在此链接上使用相同的功能link
  • @NevilleKuyt -DISTINCT 不是函数;它适用于整个SELECT 列表。我不认为你可以从你写的东西轻松到达那里。
【解决方案2】:

我会给你一些提示,这些提示在查询大型数据集或大多数数据集时会在许多情况下显示有用。

  • 如果您可以列出您想要的字段而不是查询“*”是一个更好的做法。当您拥有更多的列和更多的行时,它的权重会增加。

  • 始终尝试使用 PK 来查找数据。过滤器越具体,成本就越低。

  • 在这种情况下,索引会派上用场,因为它会使搜索更加灵活。

  • LIKE 查询通常非常缓慢且资源繁重,在您的情况下更是如此。再说一次,你越具体,它就会越好。

  • 另外补充一点,如果你只是想一次又一次地从这个表中检索数据,也许 VIEW 会很合适。

这些只是我想到的一些解决问题的技巧。 希望对您有所帮助。

【讨论】:

  • 是的,我是对的,但我正在寻找解决问题的最佳解决方案,我认为这不是检索过滤器元素的最佳方法。
猜你喜欢
  • 2010-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-27
  • 2019-11-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多