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

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.5K10
  • 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.7K20

    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.9K00

    mysql慢日志实践

    慢日志查询作用 慢日志查询的主要功能就是,记录sql语句中超过设定的时间阈值的查询语句。...慢查询配置项说明 登录mysql服务,使用如下命令 mysql> show variables like '%query%'; +------------------------------+-----...如何配置慢查询 配置慢查询功能的方式有两种,一种是使用mysql的配置文件配置,另外一种是使用mysql命令配置.这里建议使用配置文件配置,因为在命令配置的过程中发现有时候配置项在set命令的时候是成功了...mysql> set slow_query_log=ON; 配置好之后,查看mysql慢查询日志是否配置成功. mysql> show variables like '%query%'; +-----...MySQL慢查询使用总结 在平常的开发中,慢查询作为MySQL优化的一个途径,是非常有用的。它会记录下我们一些查询时间长的sql语句,对其语句我们进行分析,从而达到sql查询语句的最优化。

    1.1K31

    开启mysql慢查询

    mysql/slowquery.log 为慢查询日志存放的位置,一般这个目录要有MySQL的运行帐号的可写权限,一般都将这个目录设置为MySQL的数据存放目录; long_query_time=1中的1...表示查询超过两秒才记录; 方法二:命令方式 cd /usr/local/mysql/bin mysql -u root -p enter password mysql> show variables like...设置成2秒,加上global,下次进mysql已然生效 Query OK, 0 rows affected (0.00 sec) mysql> show variables like ”%slow%”;...> set global slow_query_log=’ON’;            //启用慢查询 Query OK, 0 rows affected (0.28 sec) mysql> show... variables like ”%slow%”;              //查看是否已经开启 +———————+———————————+ | Variable_name       | Value

    3.4K20
    领券