gpt4 book ai didi

mysql - 优化 MySQL 全文搜索查询?

转载 作者:行者123 更新时间:2023-11-29 00:29:31 24 4
gpt4 key购买 nike

我正在使用 mysql 作为数据库在 php 中为网站创建产品搜索系统。

目前我们有超过 10 万种产品可供搜索。我考虑过使用 MySQL 内置的全文功能(匹配和反对),而不是 Sphinx 或 Lucene,因为我们的需求强度较低。​​

因此目前我们使用 MySQL 内置的全文搜索功能,有人可以帮助我们优化这个全文搜索查询以提高效率并减少开销。

正如有人在 SO 上向我建议的那样,我可能没有以正确的方式使用全文语法。

创建表结构

-- Create Table SQL for Product --
DROP TABLE IF EXISTS `ps_search__p`;
CREATE TABLE IF NOT EXISTS `ps_search__p` (
`id` int(10) unsigned NOT NULL,
`code` varchar(100) NOT NULL,
`type` varchar(100) DEFAULT NULL,
`name` text,
`keywords` text,
`material` text,
`material_def_id` int(11) unsigned DEFAULT NULL,
`s_type` text,
`s_fabric` text,
`price` decimal(20,6) unsigned DEFAULT NULL,
`build_type` varchar(12) NOT NULL,
`genre` varchar(12) NOT NULL DEFAULT 'p',
`categories` text,
PRIMARY KEY (`id`),
FULLTEXT KEY `code` (`code`,`type`,`name`,`keywords`,`material`,`s_type`,`s_fabric`,`categories`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;


-- Create SQL Table for S table --
DROP TABLE IF EXISTS `ps_search__s`;
CREATE TABLE IF NOT EXISTS `ps_search__s` (
`id` int(20) unsigned NOT NULL,
`s_id` varchar(100) NOT NULL,
`type` varchar(100) NOT NULL,
`fabric` varchar(100) DEFAULT NULL,
`name` varchar(100) DEFAULT NULL,
`price` decimal(20,6) unsigned DEFAULT NULL,
`genre` varchar(12) NOT NULL DEFAULT 's',
`categories` text,
PRIMARY KEY (`id`),
FULLTEXT KEY `s_id` (`s_id`,`type`,`fabric`,`name`,`categories`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

全文搜索查询

SELECT SQL_CALC_FOUND_ROWS * FROM (
( SELECT
`id`, `code`, `name`, `material`,`material_def_id`, `s_type`, `s_fabric`, `price`, `genre`, `categories`,
MATCH (`code`,`type`,`name`,`keywords`,`material`,`s_type`,`s_fabric`,`categories`)
AGAINST ('+cotton*' IN BOOLEAN MODE) AS `relevance`
FROM `ps_search__p`
WHERE
( MATCH (`code`,`type`,`name`,`keywords`,`material`,`s_type`,`s_fabric`,`categories`)
AGAINST ('+cotton*' IN BOOLEAN MODE))
AND `s_type` REGEXP '.*'
AND `s_fabric` REGEXP '.*'
AND `material` REGEXP '.*'
AND `price` REGEXP '.*'
AND `categories` REGEXP '.*'
)
UNION ALL
( SELECT
`id`, `s_id`, `name`, NULL AS `material`, NULL AS `material_def_id`, `type`, `fabric`, `price`, `genre`, `categories`,
MATCH (`s_id`,`type`,`fabric`,`name`,`categories`)
AGAINST ('+cotton*' IN BOOLEAN MODE) AS `relevance`
FROM `ps_search__s`
WHERE
( MATCH (`s_id`,`type`,`fabric`,`name`,`categories`)
AGAINST ('+cotton*' IN BOOLEAN MODE))
AND `type` REGEXP '.*'
AND `fabric` REGEXP '.*'
AND `price` REGEXP '.*'
AND IFNULL(`categories`, '') REGEXP '.*' )
) AS `tblsearch`
ORDER BY `relevance` DESC
LIMIT 0, 36

并获取查询计数

SELECT FOUND_ROWS() 'recordsnum';

即使是很小的帮助也会感激不尽。

最佳答案

将所有测试 REGEXP '.*' 替换为 IS NOT NULL

利用全文索引,用 MATCH(fabric) AGAINST ("+Cotton"IN BOOLEAN MODE) OR MATCH(fabric) AGAINST ( bool 模式中的“+尼龙”)

Normalize your database .列不应包含非标量值(例如 CSV 数据)。相反,应该使用新表建立一对多关系。

关于mysql - 优化 MySQL 全文搜索查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17278057/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com