全文搜索(Mysql)第一次很慢,然后从第二次开始它变得更快

发布于 2024-09-06 05:53:55 字数 2881 浏览 4 评论 0原文

我有一个包含 4000 条记录的表(通过全文搜索更容易处理)。当第一次执行搜索查询时,速度要慢得多。大约需要 5 到 10 秒。然后它会变得更快。如果该站点在 10 或 15 分钟内保持不活动状态,并且当我尝试再次执行查询时,它会变得更慢。

我用的是mysql+PHP。我猜这是缓存问题。我们的网站托管在第三方服务器中,我无法访问其中的缓存。

有什么办法可以解决我的问题吗?

提前致谢!

编辑:

嗨, 感谢您的回复。这是我的查询。

从 product_2_category、product、merchant 中选择 product_2_category.product_id,其中 product_2_category.product_id = product.id AND product.PRO_STATUS='active' AND product.MERCHANT_ID = MERCHANT.ID AND MERCHANT.M_STATUS='active' AND (CAT_ID='1' OR CAT_ID='1004' 或 CAT_ID='1005' 或 CAT_ID='1006' 或 CAT_ID='1007' 或 CAT_ID='1008' 或 CAT_ID='1002' 或 CAT_ID='1003' 或 CAT_ID='45' 或 CAT_ID= '46' 或 CAT_ID='74' 或 CAT_ID='75' 或 CAT_ID='76' 或 CAT_ID='49' 或 CAT_ID='50' 或 CAT_ID='77' 或 CAT_ID='78' 或 CAT_ID='79 ' 或 CAT_ID='80' 或 CAT_ID='81' 或 CAT_ID='82' 或 CAT_ID='83' 或 CAT_ID='84' 或 CAT_ID='47' 或 CAT_ID='89' 或 CAT_ID='51' 或CAT_ID='52' 或 CAT_ID='88' 或 CAT_ID='87' 或 CAT_ID='86' 或 CAT_ID='85' 或 CAT_ID='48' 或 CAT_ID='53' 或 CAT_ID='54' 或 CAT_ID= '90' 或 CAT_ID='200' 或 CAT_ID='91' 或 CAT_ID='92' 或 CAT_ID='93' 或 CAT_ID='94' 或 CAT_ID='11' 或 CAT_ID='95' 或 CAT_ID='98 ' 或 CAT_ID='99' 或 CAT_ID='100' 或 CAT_ID='101' 或 CAT_ID='96' 或 CAT_ID='102' 或 CAT_ID='103' 或 CAT_ID='104' 或 CAT_ID='105' 或CAT_ID='106' 或 CAT_ID='97' 或 CAT_ID='107' 或 CAT_ID='108' 或 CAT_ID='109' 或 CAT_ID='110' 或 CAT_ID='114' 或 CAT_ID='119' 或 CAT_ID= '120' 或 CAT_ID='121' 或 CAT_ID='115' 或 CAT_ID='122' 或 CAT_ID='123' 或 CAT_ID='124' 或 CAT_ID='125' 或 CAT_ID='116' 或 CAT_ID='127 ' 或 CAT_ID='128' 或 CAT_ID='129' 或 CAT_ID='117' 或 CAT_ID='130' 或 CAT_ID='131' 或 CAT_ID='118' 或 CAT_ID='111' 或 CAT_ID='132' 或CAT_ID='136' 或 CAT_ID='137' 或 CAT_ID='138' 或 CAT_ID='139' 或 CAT_ID='140' 或 CAT_ID='133' 或 CAT_ID='141' 或 CAT_ID='142' 或 CAT_ID= '143' 或 CAT_ID='144' 或 CAT_ID='145' 或 CAT_ID='146' 或 CAT_ID='134' 或 CAT_ID='147' 或 CAT_ID='148' 或 CAT_ID='149' 或 CAT_ID='150 ' 或 CAT_ID='151' 或 CAT_ID='135' 或 CAT_ID='152' 或 CAT_ID='153' 或 CAT_ID='154' 或 CAT_ID='155' 或 CAT_ID='156' 或 CAT_ID='64' 或CAT_ID='158' 或 CAT_ID='70' 或 CAT_ID='164' 或 CAT_ID='71' 或 CAT_ID='165' 或 CAT_ID='159' 或 CAT_ID='166' 或 CAT_ID='167' 或 CAT_ID= '168' 或 CAT_ID='169' 或 CAT_ID='160' 或 CAT_ID='73' 或 CAT_ID='170' 或 CAT_ID='172' 或 CAT_ID='173' 或 CAT_ID='174' 或 CAT_ID='161 ' 或 CAT_ID='175' 或 CAT_ID='176' 或 CAT_ID='177' 或 CAT_ID='178' 或 CAT_ID='162' 或 CAT_ID='179' 或 CAT_ID='180' 或 CAT_ID='181' 或CAT_ID='182' 或 CAT_ID='183' 或 CAT_ID='163' 或 CAT_ID='184' 或 CAT_ID='192' 或 CAT_ID='191' 或 CAT_ID='190' 或 CAT_ID='189' 或 CAT_ID= '188' 或 CAT_ID='187' 或 CAT_ID='186' 或 CAT_ID='185' 或 CAT_ID='193' 或 CAT_ID='112' 或 CAT_ID='113' 或 CAT_ID='65' 或 CAT_ID='66 ' OR CAT_ID='67' OR CAT_ID='68' OR CAT_ID='69') AND MATCH(Product.TITLE) AGAINST('shirt' IN BOOLEAN MODE) ORDER BY Product.TITLE ASC LIMIT 0, 12

我们的网站托管在第三方 Web 服务器(Plesk 控制面板)上。所以不知道是否可以安装其他软件。

我们的网站是 2010.shoppingstrip.com.au。当您搜索某些内容时,将执行此查询。

谢谢

I have a table with 4000 records(Which is much easier to handle through full text search). when the search query is executed for the first time it is much slower. It takes about 5 to 10 seconds. Then it gets faster. If the site remains inactive for 10 or 15 minutes, and when I try to execute the query again it gets slower.

I am using mysql+PHP. I guess this is caching issue. Our site is hosted in a third party server in which I have no access to cache.

Is there any workaround for my problem.

Thanks in advance!

Edit:

Hi,
Thanks for your reply. Here is my query.

SELECT PRODUCT_2_CATEGORY.PRODUCT_ID FROM PRODUCT_2_CATEGORY, PRODUCT, MERCHANT WHERE PRODUCT_2_CATEGORY.PRODUCT_ID = PRODUCT.ID AND PRODUCT.PRO_STATUS='active' AND PRODUCT.MERCHANT_ID = MERCHANT.ID AND MERCHANT.M_STATUS='active' AND ( CAT_ID='1' OR CAT_ID='1004' OR CAT_ID='1005' OR CAT_ID='1006' OR CAT_ID='1007' OR CAT_ID='1008' OR CAT_ID='1002' OR CAT_ID='1003' OR CAT_ID='45' OR CAT_ID='46' OR CAT_ID='74' OR CAT_ID='75' OR CAT_ID='76' OR CAT_ID='49' OR CAT_ID='50' OR CAT_ID='77' OR CAT_ID='78' OR CAT_ID='79' OR CAT_ID='80' OR CAT_ID='81' OR CAT_ID='82' OR CAT_ID='83' OR CAT_ID='84' OR CAT_ID='47' OR CAT_ID='89' OR CAT_ID='51' OR CAT_ID='52' OR CAT_ID='88' OR CAT_ID='87' OR CAT_ID='86' OR CAT_ID='85' OR CAT_ID='48' OR CAT_ID='53' OR CAT_ID='54' OR CAT_ID='90' OR CAT_ID='200' OR CAT_ID='91' OR CAT_ID='92' OR CAT_ID='93' OR CAT_ID='94' OR CAT_ID='11' OR CAT_ID='95' OR CAT_ID='98' OR CAT_ID='99' OR CAT_ID='100' OR CAT_ID='101' OR CAT_ID='96' OR CAT_ID='102' OR CAT_ID='103' OR CAT_ID='104' OR CAT_ID='105' OR CAT_ID='106' OR CAT_ID='97' OR CAT_ID='107' OR CAT_ID='108' OR CAT_ID='109' OR CAT_ID='110' OR CAT_ID='114' OR CAT_ID='119' OR CAT_ID='120' OR CAT_ID='121' OR CAT_ID='115' OR CAT_ID='122' OR CAT_ID='123' OR CAT_ID='124' OR CAT_ID='125' OR CAT_ID='116' OR CAT_ID='127' OR CAT_ID='128' OR CAT_ID='129' OR CAT_ID='117' OR CAT_ID='130' OR CAT_ID='131' OR CAT_ID='118' OR CAT_ID='111' OR CAT_ID='132' OR CAT_ID='136' OR CAT_ID='137' OR CAT_ID='138' OR CAT_ID='139' OR CAT_ID='140' OR CAT_ID='133' OR CAT_ID='141' OR CAT_ID='142' OR CAT_ID='143' OR CAT_ID='144' OR CAT_ID='145' OR CAT_ID='146' OR CAT_ID='134' OR CAT_ID='147' OR CAT_ID='148' OR CAT_ID='149' OR CAT_ID='150' OR CAT_ID='151' OR CAT_ID='135' OR CAT_ID='152' OR CAT_ID='153' OR CAT_ID='154' OR CAT_ID='155' OR CAT_ID='156' OR CAT_ID='64' OR CAT_ID='158' OR CAT_ID='70' OR CAT_ID='164' OR CAT_ID='71' OR CAT_ID='165' OR CAT_ID='159' OR CAT_ID='166' OR CAT_ID='167' OR CAT_ID='168' OR CAT_ID='169' OR CAT_ID='160' OR CAT_ID='73' OR CAT_ID='170' OR CAT_ID='172' OR CAT_ID='173' OR CAT_ID='174' OR CAT_ID='161' OR CAT_ID='175' OR CAT_ID='176' OR CAT_ID='177' OR CAT_ID='178' OR CAT_ID='162' OR CAT_ID='179' OR CAT_ID='180' OR CAT_ID='181' OR CAT_ID='182' OR CAT_ID='183' OR CAT_ID='163' OR CAT_ID='184' OR CAT_ID='192' OR CAT_ID='191' OR CAT_ID='190' OR CAT_ID='189' OR CAT_ID='188' OR CAT_ID='187' OR CAT_ID='186' OR CAT_ID='185' OR CAT_ID='193' OR CAT_ID='112' OR CAT_ID='113' OR CAT_ID='65' OR CAT_ID='66' OR CAT_ID='67' OR CAT_ID='68' OR CAT_ID='69') AND MATCH(PRODUCT.TITLE) AGAINST('shirt' IN BOOLEAN MODE) ORDER BY PRODUCT.TITLE ASC LIMIT 0, 12

Our site is hosted on a third part web server(Plesk control panel). So, I am not sure whether other softwares can be installed.

Our site is 2010.shoppingstrip.com.au . This query will be executed when you search for some thing.

Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

我早已燃尽 2024-09-13 05:53:55

为表建立索引可以产生巨大的影响。最近,在 MySql 数据库中包含 150 万条记录的作业中,带有联接的基本查询需要花费 35 分钟以上。对表建立索引后(大约需要 3-4 分钟),查询在 4 秒内执行。

还应该检查查询是否有任何可能的改进。例如,外来连接会极大地延长查询时间。此外,运行过多的 foreach 循环一次获取一条记录可能会导致过多的延迟。根据您的情况,您也许能够优化查询以仅搜索特定的基本元素,以寻求更好的性能。

要测试您的查询,请在本地计算机上放置 WAMP 服务器的副本。导入脚本和数据库,并运行一些测试。这可以确定您的查询是否效率低下或者问题是否出在服务器上。

还要考虑您使用的搜索方法。例如,在 mysql 中查找值可以使用“LIKE”、“=”、“REGEXP”等运算符来完成。尝试提高性能并减少加载时间。

最后,如果所有其他方法都失败,您可以求助于缓存解决方案或更强大的数据库托管。从总体上看,4,000 条记录并不是很大,而且您不应该遇到如此缓慢的加载时间。我很幸运能够通过 Zend Framework 的内置缓存系统进行缓存。

如果您仍然一无所获,请发布您的查询示例,我们可以直接解决!

Indexing your table can make a huge difference. On a recent job with 1.5 million records in a MySql database, a basic query with a join was taking upwards of 35 minutes. After indexing the table (which took about 3-4 minutes) the query executed in 4 seconds.

Queries should also be examined for any possible improvements. For example, exotic joins can dramatically lengthen queries. Also, running excessive foreach loops to grab a record at a time can cause excessive lag. Depending on your circumstance, you may be able to hone the query to search for only specific, essential elements to eek out better performance.

To test your query, throw a copy of WAMP server on your local machine. Import the script and the database, and run a few tests. This could isolate whether your query is inefficient or if the problem lies with the server.

Consider the search methods you use too. For example, finding a value in mysql could be accomplished with operators such as "LIKE", "=", "REGEXP", etc. Experiment to improve performance and decrease load times.

Finally, if all else fails, you could resort to a caching solution or more robust database hosting. 4,000 records is not very large in the grand scheme of things, and you shouldn't be experiencing such slow load times. I've had good luck with caching via Zend Framework's built in caching system.

If you've still gotten nowhere, post a sample of your query and we can go to town on it!

╭⌒浅淡时光〆 2024-09-13 05:53:55

MySQL 在全文搜索方面确实很糟糕,无论是在性能还是易用性方面。

我建议您使用 Sphinx 来实现此目的。

MySQL is really bad at full text searching, both in term of performance and ease of use.

I would recomment you use Sphinx for this.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文