我有一个这样的数据库

DATABASE

warehouse_folders
folder_id
folder_box_id
folder_number
folder_title
folder_content
folder_notes

warehouse_folder_value
folder_value_id
folder_value_folder_id
folder_value_01
folder_value_02
folder_value_03
folder_value_04
folder_value_05
folder_value_06
folder_value_07
folder_value_08
folder_value_09
folder_value_00
folder_value_11
folder_value_12

warehouse_box
box_id
box_number
box_description


**和大约40.000行。
所有字段都是varchar,我为所有字段创建了索引。

我想执行全文搜索(PHP和MySQL_),但是在添加JOINS数据库时停止响应。

有什么需要解决的吗?**

QUERY

SELECT
*

FROM
warehouse_folders

LEFT JOIN
warehouse_folder_value ON folder_value_id = folder_id

LEFT JOIN
warehouse_boxes ON box_id = folder_box_id



WHERE
(

(`box_number` LIKE '%".$search."%') OR
(`box_description` LIKE '%".$search."%') OR
(`folder_number` LIKE '%".$search."%') OR
(`folder_title` LIKE '%".$search."%') OR
(`folder_content` LIKE '%".$search."%') OR
(`folder_notes` LIKE '%".$search."%') OR
(`folder_value_01` LIKE '%".$search."%') OR
(`folder_value_02` LIKE '%".$search."%') OR
(`folder_value_03` LIKE '%".$search."%') OR
(`folder_value_04` LIKE '%".$search."%') OR
(`folder_value_05` LIKE '%".$search."%') OR
(`folder_value_06` LIKE '%".$search."%') OR
(`folder_value_07` LIKE '%".$search."%') OR
(`folder_value_08` LIKE '%".$search."%') OR
(`folder_value_09` LIKE '%".$search."%') OR
(`folder_value_10` LIKE '%".$search."%') OR
(`folder_value_11` LIKE '%".$search."%') OR
(`folder_value_12` LIKE '%".$search."%')

)

最佳答案

like运算符不执行全文搜索,它执行简单的模式匹配。是match(...) against(...)运算符进行全文搜索,但是您应该创建全文索引以支持此类搜索。
像“%constant%”这样的搜索不能使用索引,因为该模式可以适合字段中文本的任何部分。
Mysql对查询中的表使用单个索引。使用or条件,它可能会为操作中的1个字段(而不是全部字段)使用索引。您可以重写where条件以使用union而不是or--但只要模式具有该前导通配符,它​​就没有用。


上面的组合使您的sql查询变慢。您可以使用解释来验证以上内容,这无疑会显示全表扫描。

根据您的确切需求,转换为全文索引和全文搜索,或者实施某些外部全文搜索解决方案可以提高您的性能。

关于php - 全文搜索速度慢,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36795996/

10-13 00:36