MYSQL PHP:如何在有限制的情况下加快select%like%逗号列表搜索?
如何加快%like搜索?我需要帮助。 想法1=限制, idea 2=拆分逗号关键字以分隔列MYSQL PHP:如何在有限制的情况下加快select%like%逗号列表搜索?,php,mysql,Php,Mysql,如何加快%like搜索?我需要帮助。 想法1=限制, idea 2=拆分逗号关键字以分隔列 它是一个逗号分隔的关键字列表 1000个结果之后,搜索查询可以停止,以加快搜索查询(如何?) 如果我可以使用限制,我需要让搜索查询以“最佳评级产品”=“评级”开始,并在大约1000个结果后停止(如何?) 我的搜索查询:replace(b.keywords,','')像“%”“%$searchvalue.”“; 我的想法(1)是将结果限制在1000。但是我如何控制选择,以便首先搜索具有最佳评级的产品,而不会
replace(b.keywords,','')像“%”“%$searchvalue.”“;
ID RATING PRODUCTS KEYWORDS
1 1000 p1 keyword1,keyword2,...,keyword100
... 4 ... ...
99000 200 p99000 keyword1,keyword99,...,keyword999
“评级”和“关键词”(多语言)不断变化
我的想法(2)是将每个关键字分隔在一列中。这样我就不需要前面的%$searchvalue%。但是我担心,每个产品将至少有200个额外的列,这将导致相同的搜索查询(?)。你认为呢
ID RATING PRODUCTS KEYWORD1 KEYWORD2 KEYWORD3 ... KEYWORD**200**
1 1000 p1 red blue yellow ... yellow-orange
... 4 ... ...
99000 200 p99000 black blue orange ... yellow-orange
使用单独的表
产品\u关键字
CREATE TABLE product_keywords (
product_id INT NOT NULL,
keyword VARCHAR(50) NOT NULL,
FOREIGN KEY (product_id) REFEREFENCES products (id),
UNIQUE INDEX (product_id, keyword)
);
加入此表以查找与关键字匹配的产品
如果您需要多语言关键字支持,可以使用关键字表的外键替换关键字
,该表可以包含多种语言的关键字
CREATE TABLE keywords (
id INT NOT NULL,
language VARCHAR(10),
keyword VARCHAR(50),
UNIQUE KEY (id, language),
INDEX (keyword, language)
);
CREATE TABLE product_keywords (
product_id INT NOT NULL,
keyword_id INT NOT NULL,
FOREIGN KEY (product_id) REFEREFENCES products (id),
FOREIGN KEY (keyword_id) REFERENCES keywords (id),
UNIQUE INDEX (product_id, keyword_id)
);
然后,查询可能看起来像
SELECT p.*
FROM products AS p
JOIN product_keywords AS pk ON p.id = pk.product_id
JOIN keywords AS k on k.id = pk.keyword_id
WHERE k.language = 'en' AND k.keyword = 'blue'
首先不要使用逗号分隔的列表。规范化您的表,并为每个关键字创建一个单独的
product_关键字
表,每个关键字都有单独的行。遗憾的是,这些关键字每天都在变化,而且是用户生成的,而且是多语言的,它们的关键字列表太长了。英语、法语、德语、俄语……我可以创建一个关键字li仅使用英语进行st和翻译搜索查询,但翻译所有搜索查询的成本太高。:(您将如何翻译您的设计?@barmar用户生成的关键字将被选中并脱机翻译(复制粘贴)然后添加到每个产品的关键字逗号列表中。目前,英语、法语、德语、俄语、西班牙语搜索逗号分隔列表的速度非常慢,无法编制索引。我认为你的答案非常好。我可以问你如何转换当前数据库吗?首先,我必须规范逗号列表并去掉空格然后..选择关键字1..关键字2,…插入忽略..?我看了这个。它为每个关键字生成一个附加ID。查找,但找不到,1个关键字和所有ID的组合。我误解了吗?PRODUCT_ID 1,2299000您应该发布一个新问题,显示您尝试的内容和结果。我这样做了,并且:(发生了这种情况,我知道这很糟糕,我现在为什么这么做,谁在这里阻止提问?奇怪:这个问题在这里已经有答案了:在数据库列中存储分隔列表真的那么糟糕吗?(10个答案)