首页
学习
活动
专区
圈层
工具
发布

mysql like中文慢

MySQL 中使用 LIKE 查询中文数据时,查询速度可能会较慢,主要原因包括字符集、索引效率、全表扫描等因素。以下是优化建议和解决方案:


​​1. 检查字符集和排序规则​​

确保 MySQL 数据库、表和字段的字符集支持中文(如 utf8mb4),并使用合适的排序规则(如 utf8mb4_general_ci 或 utf8mb4_unicode_ci)。

代码语言:javascript
代码运行次数:0
复制
-- 查看数据库字符集
SHOW CREATE DATABASE your_database;

-- 查看表字符集
SHOW CREATE TABLE your_table;

-- 修改表的字符集(如果需要)
ALTER TABLE your_table CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

​​注意​​:

  • utf8mb4 比 utf8 支持更完整的 Unicode(如 Emoji)。
  • 排序规则影响索引效率,utf8mb4_general_ci 比 utf8mb4_unicode_ci 更快,但排序可能不精确。

​​2. 使用前缀索引优化 LIKE 'xxx%' 查询​​

如果查询模式是 LIKE 'abc%'(前缀匹配),可以创建前缀索引:

代码语言:javascript
代码运行次数:0
复制
-- 创建前缀索引(适用于 VARCHAR 类型)
ALTER TABLE your_table ADD INDEX idx_name_prefix (name(10)); -- 10 是前缀长度

​​适用场景​​:

  • LIKE 'abc%'(前缀匹配)可以利用索引。
  • LIKE '%abc' 或 LIKE '%abc%' 无法利用索引,仍然会全表扫描。

​​3. 使用全文索引(FULLTEXT)​​

如果查询模式是模糊匹配(如 LIKE '%关键词%'),可以使用 MySQL 的 ​​FULLTEXT 索引​​(适用于 InnoDB 和 MyISAM 引擎)。

​​(1)创建 FULLTEXT 索引​​

代码语言:javascript
代码运行次数:0
复制
ALTER TABLE your_table ADD FULLTEXT INDEX idx_fulltext_name (name);

​​(2)使用 MATCH ... AGAINST 查询​​

代码语言:javascript
代码运行次数:0
复制
SELECT * FROM your_table 
WHERE MATCH(name) AGAINST('关键词' IN NATURAL LANGUAGE MODE);

​​注意​​:

  • FULLTEXT 适用于较长的文本搜索,对短词(如 1-2 个字符)可能不敏感。
  • 可以调整 innodb_ft_min_token_size(默认 3)和 ft_min_word_len(默认 4)来优化。

​​4. 使用 N-gram 分词(适用于中文全文搜索)​​

MySQL 的 FULLTEXT 对中文支持较差,可以使用 ​​N-gram 分词​​(需 MySQL 5.7+)。

​​(1)修改 MySQL 配置​​

在 my.cnf 或 my.ini 中添加:

代码语言:javascript
代码运行次数:0
复制
[mysqld]
ngram_token_size=2  # 设置 N-gram 分词的最小长度(默认 1)

​​(2)创建 N-gram FULLTEXT 索引​​

代码语言:javascript
代码运行次数:0
复制
ALTER TABLE your_table ADD FULLTEXT INDEX idx_ngram_name (name) WITH PARSER ngram;

​​(3)查询​​

代码语言:javascript
代码运行次数:0
复制
SELECT * FROM your_table 
WHERE MATCH(name) AGAINST('关键词' IN NATURAL LANGUAGE MODE);

​​优点​​:

  • 对中文分词更友好,支持短词搜索。
  • 比 LIKE '%关键词%' 快很多。

​​5. 使用外部搜索引擎(如 Elasticsearch)​​

如果数据量很大,MySQL 的全文搜索性能可能仍然不足,可以考虑:

  • ​​Elasticsearch​​(推荐)
  • ​​Sphinx​​
  • ​​Solr​​

​​示例(Elasticsearch)​​:

  1. 安装 Elasticsearch 并配置中文分词插件(如 ik_smart)。
  2. 将 MySQL 数据同步到 Elasticsearch。
  3. 使用 Elasticsearch 的 match 查询:{ "query": { "match": { "name": "关键词" } } }

​​6. 优化查询方式​​

​​(1)避免 LIKE '%xxx%'​​

  • LIKE '%xxx%' 无法使用索引,只能全表扫描。
  • 如果必须使用,考虑缓存结果或使用外部搜索引擎。

​​(2)使用 LIKE 'xxx%' 并加索引​​

代码语言:javascript
代码运行次数:0
复制
-- 如果查询是 LIKE 'abc%',可以加前缀索引
SELECT * FROM your_table WHERE name LIKE 'abc%';

​​(3)使用 REGEXP 替代(谨慎使用)​​

代码语言:javascript
代码运行次数:0
复制
SELECT * FROM your_table WHERE name REGEXP '关键词';

​​注意​​:REGEXP 性能较差,仅适用于复杂匹配。


​​7. 其他优化建议​​

  • ​​减少返回字段​​:只查询需要的列,避免 SELECT *。
  • ​​分页查询​​:使用 LIMIT 减少数据量。
  • ​​缓存结果​​:对高频查询使用 Redis 缓存。
  • ​​升级 MySQL 版本​​:新版本(如 8.0)对全文搜索有优化。
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

like模糊匹配查询慢解决之道——MySQL全文索引

* from t_chinese_phrase where instr(phrase,'昌') > 0; select * from t_chinese_phrase where phrase like...但是使用部分单词去查询或者使用部分中文去查询时,是查询不出来数据的,像中文需要使用中文分词器进行分词。...中文分词与全文索引 InnoDB默认的全文索引parser非常合适于Latin,因为Latin是通过空格来分词的。但对于像中文,日文和韩文来说,没有这样的分隔符。...查一下目前的值 show variables like '%token%'; 参数解析: innodb_ft_min_token_size 默认3,表示最小3个字符作为一个关键词,增大该值可减少全文索引的大小...之前的版本不支持中文,需使用第三方插件 6、全文索引只能在 InnoDB(MySQL 5.6以后) 或 MyISAM 的表上使用,并且只能用于创建 char,varchar,text 类型的列。

1.4K10
  • Mysql 慢日志

    my.cnf 是windows环境下的配置文件,my.ini是linux下的配置文件 没有此ini(配置)文件,Mysql能正常跑么?...查看慢日志是否开启 show variables like 'slow_query%'; image.png image.png 开启慢日志 set global slow_query_log='ON'...; image.png 查看当前有多少条慢日志 show global status like '%slow_queries%'; image.png 制造一条慢SQL select sleep(10...); 查看慢日志记录时间 // 查看当前会话的,如果修改成功,也不会看到改变,(等个几秒,重开一个窗口,执行命令,才能看见) show variables like 'long_query_time';...慢日志有2种存储形式 一个默认的是File,一个是Table 查看慢日志的类型 show variables like '%log_output%'; image.png 设置慢日志的类型 设置为:FILE

    4.6K20

    Mysql资料 慢查询

    一.简介 MySQL的慢查询,全名是慢查询日志,是MySQL提供的一种日志记录,用来记录在MySQL中响应时间超过阀值的语句。...默认情况下,MySQL数据库并不启动慢查询日志,需要手动来设置这个参数。当然,如果不是调优需要的话,一般不建议启动该参数,因为开启慢查询日志会或多或少带来一定的性能影响。...二.查询 slow_query_log 慢查询开启状态 slow_query_log_file 慢查询日志存放的位置(这个目录需要MySQL的运行帐号的可写权限,一般设置为MySQL的数据存放目录) long_query_time...查询超过多少秒才记录 查看是否开启和存放位置,当前为关闭状态 show variables like 'slow_query%'; 多少米才记录,当前10秒 show variables like...放一个慢查询语句 mysql> select sleep(2); 查看日志是否生成并有那个语句 cat /usr/local/mysql/data/slow.log

    2.8K00

    MySQL——开启慢查询

    前言 开启慢查询日志,可以让MySQL记录下查询超过指定时间的语句,通过定位分析性能的瓶颈,才能更好的优化数据库系统的性能。...参数说明 slow_query_log 慢查询开启状态 slow_query_log_file 慢查询日志存放的位置(这个目录需要MySQL的运行帐号的可写权限,一般设置为MySQL的数据存放目录)...long_query_time 查询超过多少秒才记录 设置步骤 查看慢查询相关参数 MySQL [(none)]> show variables like 'slow_query%'; +------...long_query_time=1; 查看设置后的参数 MySQL [(none)]> show variables like 'slow_query%'; +--------------------...SQL mysql> select sleep(2); 查看是否生成日志 tail -f /data/mysql/mysql-slow.log 如果日志存在,MySQL开启慢查询设置成功!

    77610

    Mysql慢查询(配置)

    慢查询?什么鬼?查询很慢吗?...刚看一脸萌,学无止境 好吧,就是执行很慢的SQL 什么是慢查询 慢查询定义及作用 慢查询日志,顾名思义,就是查询慢的日志(感觉在说F话),是指Mysql记录所有执行超过long_query_time 参数设定的时间阈值的...该日志能为SQL语句的优化带来很好的帮助,默认情况下慢查询是关闭的,要使用慢查询日志功能,首先要开启慢查询日志功能。...常用配置: show_query_log启动或停止慢查询日志技术 show_query_log_file指定慢查询日志的存储路劲及其文件(默认和数据文件放在一起) long_query_time指定记录慢查询日志...作者:彼岸舞 时间:2020\07\08 内容关于:Mysql 本文来源于网络,只做技术分享,一概不负任何责任

    1.2K10
    领券