2021-04-01 12:59:29
在MySQL中优化LIKE和REGEXP查询的核心是减少全表扫描、合理利用索引,并根据实际需求选择更高效的匹配方式。以下是具体优化策略:
1. 优化LIKE查询使用前缀索引加速查询
当使用LIKE 'prefix%'(前缀匹配)时,MySQL可以利用B-Tree索引加速查询。
操作建议:
确保被查询的列(如name、title)已创建索引。
对长文本字段,可创建前缀索引以节省空间并提升性能:CREATE INDEX idx_name ON users(name(10)); -- 截取前10个字符作为索引
注意:前缀长度需足够区分数据,避免过短导致索引失效,或过长浪费空间。
避免低效的通配符用法
通配符开头(如LIKE '%abc'或备耐LIKE '%abc%')会导致全表扫描,应尽量避免。
优化建议:
优先使用LIKE 'john%'(前缀匹配),而非LIKE '%john%'(中间匹配)。
若必须做中间匹配,可结合其他过滤条件(如时间范围、状态字段)缩小结果集。
考虑在应用层拆分关键词,或使用全文索引替代。
简单模式匹配:用LIKE替代REGEXP。例如:
REGEXP '^abc' → 改用LIKE 'abc%'。
多固定值匹配:用IN或OR替代正则。例如:
REGEXP 'apple|orange' → 改用WHERE column IN ('apple', 'orange')。
复杂规则:考虑在应用层处理,或缓存结果。
必须使用REGEXP时:确保WHERE条件中有其他索引字段先过滤数据,减少正则匹配的数据量。
为CHAR、VARCHAR或TEXT类型字段创建FULLTEXT索仿芹春引:ALTER TABLE articles ADD FULLTEXT(title, content);
使用MATCH...AGAINST语法查询:SELECT * FROM articles WHERE MATCH(title, content) AGAINST('database' IN BOOLEAN MODE);
通过合理设计索引和选择匹配方式,即使模糊查询也能保持高效性能。