Py学习  »  DATABASE

搜索MySQL文本列的最佳方式

Miguel Moreira • 2 年前 • 505 次点击  

我的产品存储在MySQL数据库中,这是一个Wordpress网站,但我的数据存储在自定义表中。我需要搜索产品,我目前面临一些性能问题,我希望有人能帮助我或为我指路。

由于我每天收到一个文件(*.csv)来更新我的所有产品(添加、更新或删除产品),我有一个读取文件和填充/更新表格的过程。在这个过程中,我添加了一个步骤来过滤数据,并将任何特殊字符替换为“非特殊”字符(例如:将“Ô替换为“a”)。

到目前为止,我已经有了一个与产品表(products)相关的表(products_search),我用这个表进行搜索。当用户搜索某个内容时,我修改输入以替换特殊字符,因此搜索将直接在表上进行。

问题是: 在“文本”列中搜索很慢,甚至在该列上添加索引。我现在正在这样搜索:

select * from products_search
     where description like %search_word_1%
        or description like %search_word_2% ... 

如果我得到一个结果,我将获得ID和产品表的关联,并获得可能需要向用户显示的所有信息。

寻找的解决方案: 我正在寻找一种在产品搜索表上搜索性能更好的方法。据我所知,wordpress搜索引擎只对“posts”表起作用。有什么方法可以更快地搜索吗?也许是使用插件,或者只是改变搜索的方式。

谢谢大家

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/132373
 
505 次点击  
文章 [ 1 ]  |  最新文章 2 年前
Rick James
Reply   •   1 楼
Rick James    2 年前

我认为我们需要修改夜间加载,以使索引创建更高效。

我假设:

  • CSV文件中的数据将替换现有数据。
  • 你愿意使用 FULLTEXT 用于搜索。

然后做:

  1. CREATE TABLE new_data (...) ENGINE=InnoDB;
  2. LOAD DATA INTO new_data ...;
  3. 清理中的数据 new_data .
  4. ALTER TABLE new_data ADD FULLTEXT(...) ; 此处要索引的列存在,或在步骤1或3中添加。
  5. RENAME TABLE real_data TO old_data, new_data TO real_data;
  6. DROP TABLE old_data;

请注意,这基本上没有停机时间 real_data 所以你可以继续这样做 SELECTs .

您还没有解释如何将单个CSV文件喷洒到wp_帖子和wp_Posteta中。这听起来像是埋在我第三步里的噩梦。

全文 远比用 wp_postmeta (我不知道是否有现有的方法或插件来实现这一点。)

有了`全文(描述),您的代码片段将使用

WHERE MATCH(description) AGAINST ('word1 word2' IN BOOLEAN MODE)

而不是非常缓慢 LIKE 使用前导通配符。

如果你必须使用wp_Posteta,我建议 https://wordpress.org/plugins/index-wp-mysql-for-speed/