如何优化 MySQL 查询中 LIKE 和 IN 的组合搜索商品?

嘿,在 MySQL 中搜索产品时,同时使用 LIKE 和 IN 时要小心。
说实话,我已经存在十年了,我见过很多人因为这种组合而受苦。

看,只需使用“%洗衣粉%”即可。
MySQL必须搜索整个name字段才能找到这个对象,这是非常费力的。
至于IN(1 ,2 ,3 ),如果数字太多,查询会很慢。
如果一起使用,性能问题就会增加。

例如,这个 SELECT FROM products like '%洗衣粉%' 和category_id(1 ,2 ,3 ),坦率地说,您的查询运行速度可能非常慢,特别是在产品表非常大的情况下。
更好的方法是全文搜索。
MySQL 5 .6 之后,InnoDB支持全文索引,特别是对于产品名称、描述等文本字段。
将全文(名称)添加到更改表产品中。

然后使用 AGAINST('Blue Moon Laundry Detergent' in BOOLEAN MODE) MATCH(name) 替换 LIKE '%keyword%':
sql SELECT match(name) WHERE products('+Blue Moon + Laundry Detergent' IN BOOLEAN MODE) AND Category_id(1 ,2 ,3 );
该对象的优点是支持模糊匹配。
例如,添加“+”号会强制包含这两个单词,无论顺序如何。
而且单词顺序并不重要,“洗衣蓝月亮”也很合适。
性能比 LIKE '%keyword%' 好很多。
如果无法使用全文索引怎么办?例如,您使用的MySQL版本太旧,或者您要搜索的字段不是文本。
然后你必须在应用层拆分查询并合并它。
例如:
sql 选择名称为“%bluemoon%”、category_id = 1 的产品 联盟所有 选择“%bluemoon%”和category_id = 2 等产品 联盟所有 选择“%bluemoon%”等产品且category_id = 3 ;
或者先检查IN中的ID列表,然后在代码中过滤LIKE条件。
这可以减少数据库的负载。

其他提示:如果您确定搜索词以“Blue Moon”开头,您可以使用 LIKE 'Blue Moon%' 让 MySQL 使用索引。
您应该添加 LIMIT 并在页面中显示它。
热门搜索词可以缓存在 Redis 中。
如果这不起作用,请考虑使用专门从事文本搜索的外部工具,例如 Elasticsearch。

在数据提取方面,IN中的category_id等字段应该添加普通索引。
其他人的全文索引字段效果不好的情况下最好不要使用。

总体而言,全文索引是最好、最高效、最简单的。
拆分查询是可选的,但取决于应用程序层是否可以处理它。
IN 中的列表太长,最好使用临时表或联接代替。

SQL中如何使用LIKE_SQL模糊查询LIKE的用法

像这个东西……很常用。
可以使用%通配符来检查后缀和后缀。
例如,如果以 Apple 开头,则写为“Apple%”,以便 iPhone 匹配。
_代表一个字符,如'S_msung%'即可查找三星。

有时您必须搜索中间有一个单词的单词,例如“Smart%”,然后您就可以找到智能手机。
但请记住,如果 % 位于前台,例如“%Phone”,那么您需要扫描整个数据库表,这非常慢。
所以最好把%放在最后。

搜索特殊字符时,例如要搜索带%的字符,需要使用ESCAPE进行转义。
例如'%%2 0_2 02 3 %'ESCAPE'',这里是转义字符,实际搜索的是下划线_。

组合查询更加灵活。
使用 AND 时,两者都必须满足,但使用 OR 时,仅满足其中之一。
例如,如果您想使用 Pro 或 Max 控​​制手机,则可以编写 AND(product_nameLIKE'%Pro%'ORproduct_nameLIKE'%Max%')。
括号不能缺失,否则优先级会错误。

就性能而言,最重要的是不要把%放在前面。
例如,“Apple%”可以使用索引,但“%Apple”速度非常慢,因为它必须遍历所有行。
全文搜索对于长文本效果很好,但并非所有数据库都支持它。
还有N-gram索引,将字符串划分为索引,可以加快模糊搜索速度,但索引会很大。

选择转义字符时要小心,不要选择数据中常见的字符。
MySQL和PostgreSQL都支持ESCAPE子句,但写法可能不同。
如果使用双重转义,例如想要控制转义字符本身,则需要使用ESCAPE再次转义。

说实话,like 用得好很方便,用不好就慢。
最重要的是,把%放在前面绝对是致命的。