我有一个这样的数据库
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/