现在我们数据库表中的记录大约在17万,每一条记录都有name字段,根据name做模糊匹配,效率非常低下。

表结构如下:

create tableT

(

idint,

namevarchar(64)

);

总数据量如下:

mysql> select count(*) fromT;+----------+

| count(*) |

+----------+

| 175152 |

+----------+

1 row in set (0.00 sec)

按照名称进行模糊匹配执行结果如下,用时0.29秒:

mysql> select count(*) from T where (name like '%玻璃奶瓶%');+----------+

| count(*) |

+----------+

| 712 |

+----------+

1 row in set (0.29 sec)

mysql> select id, name from T where (name like '%玻璃奶瓶%') limit 0,10;+---------+---------------------------------------------------------------+

| id | name |

+---------+---------------------------------------------------------------+

| 1206852 | 伊诗比蒂-120ML标准口径玻璃奶瓶防摔护套BT-1250 |

| 1206853 | 伊诗比蒂-120ML宽口径玻璃奶瓶防摔护套BT-1251 |

| 1206854 | 伊诗比蒂-200ML标准口径玻璃奶瓶防摔护套BT-1252 |

| 1206855 | 伊诗比蒂-160ML宽口径玻璃奶瓶防摔护套BT-1253 |

| 1206856 | 伊诗比蒂-240ML标准口径玻璃奶瓶防摔护套 |

| 1206857 | 240ML宽口径玻璃奶瓶防摔护套BT-1255 |

| 1309742 | 贝亲标准口径玻璃奶瓶240ml |

| 1309743 | 贝亲标准口径玻璃奶瓶200ml |

| 1309744 | 贝亲标准母乳实感奶嘴玻璃奶瓶120ml |

| 1309745 | 贝亲硅胶宽口径玻璃奶瓶240ml |

+---------+---------------------------------------------------------------+

10 rows in set (0.19 sec)

like操作无法走到索引,正好趁着机会尝试下MySql的全文索引功能。

因为中文语句不像英文,单词与单词之间用空格隔开,存在天然的分隔符,因此当前MySql的全文索引无法支持中文。

当然,也有办法可以绕过去,比如把汉字进行转码或者转成拼音,经过比较,最终还是确定使用转base64的方法,只针对中文做转换,英文和和符号不转。

首先,需要修改表结构,增加一个字段用来保存转码后的值,并创建这个字段的全文索引

alter table T add column nameindex varchar(256) not null default '';alter table T add fulltext name_index_fc(`nameindex `);

然后,通过脚本批量刷新数据,把每条记录中的name转码后存入nameindex。空格是mysql全文索引的分词符之一,为了能实现和like匹配一样的功能,需要以字为最小单位,字与字之间的base64编码用空格分开。

下面是python的转码实现:

d='伊诗比蒂-160ML宽口径玻璃奶瓶防摔护套BT-1253'baseStr= ''

for i inrange(len(d)):#print base64.encodestring(d[i].encode('utf8')).strip('\n\r')

#if re.match('[ \u4e00 -\u9fa5]+',d[i]) == None:

if d[i] >= u'\u4e00' and d[i]<=u'\u9fa5':

b= ''

if len(baseStr) !=0:

b= ' 'b+= base64.encodestring(d[i].encode('utf8')).strip('\n\r')

baseStr+=b

baseStr+= ' '

else:

dt=d[i]if d[i] == '"' or d[i] == "'":

dt= '\\'dt+=d[i]

baseStr+=dt

baseStr+= ' '

转换完成后,结果如下:

mysql> select id,name,nameindex from T where (name like '%玻璃奶瓶%') limit 0,10;+---------+---------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------+

| id | name | nameindex |

+---------+---------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------+

| 1206852 | 伊诗比蒂-120ML标准口径玻璃奶瓶防摔护套BT-1250 | 5LyK 6K+X 5q+U 6JKC -120ML 5qCH 5YeG 5Y+j 5b6E 5467 55KD 5aW2 55O2 6Ziy 5pGU 5oqk 5aWX BT-1250 |

| 1206853 | 伊诗比蒂-120ML宽口径玻璃奶瓶防摔护套BT-1251 | 5LyK 6K+X 5q+U 6JKC -120ML 5a69 5Y+j 5b6E 5467 55KD 5aW2 55O2 6Ziy 5pGU 5oqk 5aWX BT-1251 |

| 1206854 | 伊诗比蒂-200ML标准口径玻璃奶瓶防摔护套BT-1252 | 5LyK 6K+X 5q+U 6JKC -200ML 5qCH 5YeG 5Y+j 5b6E 5467 55KD 5aW2 55O2 6Ziy 5pGU 5oqk 5aWX BT-1252 |

| 1206855 | 伊诗比蒂-160ML宽口径玻璃奶瓶防摔护套BT-1253 | 5LyK 6K+X 5q+U 6JKC -160ML 5a69 5Y+j 5b6E 5467 55KD 5aW2 55O2 6Ziy 5pGU 5oqk 5aWX BT-1253 |

| 1206856 | 伊诗比蒂-240ML标准口径玻璃奶瓶防摔护套 | 5LyK 6K+X 5q+U 6JKC -240ML 5qCH 5YeG 5Y+j 5b6E 5467 55KD 5aW2 55O2 6Ziy 5pGU 5oqk 5aWX |

| 1206857 | 240ML宽口径玻璃奶瓶防摔护套BT-1255 | 240ML 5a69 5Y+j 5b6E 5467 55KD 5aW2 55O2 6Ziy 5pGU 5oqk 5aWX BT-1255 |

| 1309742 | 贝亲标准口径玻璃奶瓶240ml | 6LSd 5Lqy 5qCH 5YeG 5Y+j 5b6E 5467 55KD 5aW2 55O2 240ml |

| 1309743 | 贝亲标准口径玻璃奶瓶200ml | 6LSd 5Lqy 5qCH 5YeG 5Y+j 5b6E 5467 55KD 5aW2 55O2 200ml |

| 1309744 | 贝亲标准母乳实感奶嘴玻璃奶瓶120ml | 6LSd 5Lqy 5qCH 5YeG 5q+N 5Lmz 5a6e 5oSf 5aW2 5Zi0 5467 55KD 5aW2 55O2 120ml |

| 1309745 | 贝亲硅胶宽口径玻璃奶瓶240ml | 6LSd 5Lqy 56GF 6IO2 5a69 5Y+j 5b6E 5467 55KD 5aW2 55O2 240ml |

+---------+---------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------+

10 rows in set (0.21 sec)

测试一下性能,耗时0.05秒,提升了四倍的速度

mysql> SELECT count(*) FROM T WHERE MATCH (nameindex AGAINST ('"5467 55KD 5aW2 55O2"' INBOOLEAN MODE) ;+----------+

| count(*) |

+----------+

| 713 |

+----------+

1 row in set (0.05 sec)

再多试几次,性能都有很大的提升

mysql> select count(*) from T where (nameindex like '%凌动%');+----------+

| count(*) |

+----------+

| 70 |

+----------+

1 row in set (0.30sec)

mysql> SELECT count(*) FROM T WHERE MATCH (nameindex) AGAINST ('"5YeM 5Yqo"' INBOOLEAN MODE) ;+----------+

| count(*) |

+----------+

| 70 |

+----------+

1 row in set (0.01sec)

mysql> select count(*) from T where (nameindex like '%凌动惯性%');+----------+

| count(*) |

+----------+

| 9 |

+----------+

1 row in set (0.29sec)

mysql> SELECT count(*) FROM T WHERE MATCH (nameindex) AGAINST ('"5YeM 5Yqo 5oOv 5oCn"' INBOOLEAN MODE) ;+----------+

| count(*) |

+----------+

| 9 |

+----------+

1 row in set (0.00 sec)

细心的你,可能发现了查找‘玻璃奶瓶’的时候,用like和全文索引查找出来的记录总数相差1。

相差的这条记录如下:

mysql> select id ,name,nameindex from T where id = 1314118;+---------+-----------------------------------------------+------------------------------------------------------------------------------+

| id | name | nameindex |

+---------+-----------------------------------------------+------------------------------------------------------------------------------+

| 1314118 | NUK宽口-玻璃-奶瓶妈咪礼包40.260.718 | NUK 5a69 5Y+j - 5467 55KD - 5aW2 55O2 5aaI 5ZKq 56S8 5YyF 40.260.718 |

+---------+-----------------------------------------------+------------------------------------------------------------------------------+

在玻璃和奶瓶之间有一个“-”,因为“-”前后都是汉字,因此转码操作了,“-”成为了一个独立的字符。根据MySql全文索引的默认配置ft_min_word_len = 4,低于4个字符的词不会被保存在索引中。因此“-”被忽略。

mysql数值比中文检索快_【mysql】利用全文索引实现中文的快速查找相关推荐

  1. mysql去重操作哪个最快_如何将 MySQL 去重操作优化到极致?| CSDN 博文精选

    作者 | wzy0623 责编 | 屠敏 出品 | CSDN 博客 前言 问题提出 源表t_source结构如下: item_id int, created_time datetime, modifi ...

  2. tesseract4.0.0 中文语言包_一份TensorFlow2.0中文教程

    近两个月,网上已经出现了大量 TensorFlow 2 0 英文教程.在此文章中,本文为大家推荐一个持续更新的中文教程,以便大家学习.来源:机器之心 今年 3 月份,谷歌在 Tensorflow De ...

  3. JS获取中文拼音首字母,并通过拼音首字母快速查找页面内的中文内容

    实现效果: 图一: 图二: 此例中输入的中文字符串"万万保重",有三个字是多音字,所以alert对话框中显示的是多种读音的组合: 如何实现? 如何实现通过拼音首字母快速查找页面内的 ...

  4. mysql数值比中文检索快_MySQL 千万 级数据量根据(索引)优化 查询 速度

    一.索引的作用 索引通俗来讲就相当于书的目录,当我们根据条件查询的时候,没有索引,便需要全表扫描,数据量少还可以,一旦数据量超过百万甚至千万,一条查询sql执行往往需要几十秒甚至更多,5秒以上就已经让 ...

  5. linux下mysql写中文变成问号_如何解决数据库插入中文字体时显示问号

    欢迎点击「算法与编程之美」关注我们! 本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列文章. 问题描述 我们在进行数据库的增删改查的操作时,当我们插入英文或者 ...

  6. mysql主从复制轮训,MySQL主从配置 - 李小热_大风起兮云飞扬 - OSCHINA - 中文开源技术交流社区...

    Mysql集群配置 1 主机配置 修改mysql配置文件,windows下为my.ini,linux下为my.cnf 在mysqld节点下增加: server-id=1 log-bin=log bin ...

  7. mysql 中文数字转换_数据库中数字和中文的转换问题

    public class DaoUtil{ /** * 系统字典表 * 适用于列表循环时,根据编码获取汉字 * @param appdicid * @return */ public static H ...

  8. mysql中没有内置函数_[mysql]MySQL中的内置函数

    用在select  语句,以及子句where   order  by    hacing  中    update   delete 函数中可以将字段名作为字段来用,变量的值就是这个列对应的每一行记录 ...

  9. mysql外键约束视频教学_外键约束案例_MySQL数据库 快速入门 基础+实战 视频教程_MySQL视频-51CTO学院...

    MySQL是开源免费和功能多面的小型数据库,MySQL也是目前流行通用的关系型数据库,已经被 Oracle 收购了.随着版本更新升级,加入一些高级功能,MySQL6.x 版本也开始收费.不过本教程将使 ...

  10. mysql生产环境运维方案_[MySQL生产环境] Innodb存储引擎内存报警问题处理过程

    1 不停的收到email报警,内存值超过阀值80%了. 2 top下,mysqld进程确实占据了77.5%,再加上一些其他的辅助进程,内存usage到了81%也可以理解. [xxx@00903 5.5 ...

最新文章

  1. linux下remove函数
  2. SAP CRM WebClient UI和Hybris的controller是如何被调用的
  3. Step by Step 使用AET 创建Product extension fields
  4. html里下拉标记,HTML: select 标签
  5. 同一服务器部署多个tomcat时的端口号修改详情
  6. python模板代码替换_Python - 安全替换字符串模板(safe_substitute) 详细解释
  7. python jieba分词_从零开始学自然语言处理(八)—— jieba 黑科技
  8. Android音频焦点AudioFocus使用
  9. 大屏scroll滚动轴样式
  10. mysql 多表联合查询
  11. 2016 linux发行版排行_2018年10大最漂亮的 Linux 发行版
  12. 快速搭建接口自动化平台
  13. 寻觅那款你心仪的国际象棋app
  14. NO 00004 iOS实现打砖块游戏 一 素材的制作
  15. hwd分别是长宽高_DS-2CD7A87HWD-XZS 海康威视800万AI人脸抓拍比对筒型网络摄像机
  16. 楼兰古城如何变成了沙漠戈壁的
  17. 第17课 项目成本管理
  18. python turtle方向_Python turtle.left()用法及代码示例
  19. 腾讯ISUX:精益设计 “纸上谈兵”的说服力
  20. android系统解锁代码,魅蓝note2 解锁bootloader,刷twrp,刷安卓7.1.1系统(示例代码)

热门文章

  1. HTML+CSS实现导航条及下拉菜单
  2. 02-Hadoop集群搭建
  3. Control Cotrol Name Confusing
  4. 国外优秀免费空间不完全名单
  5. day11 红队工具篇FofaQuakeKunyuSuize水泽Arl灯塔
  6. 考研英语 - word-list-49
  7. java商城如何防止超卖_电商中怎么防止超卖
  8. Deepin常用命令、系统命令、Vi命令
  9. Linux之CentOS7.5安装及克隆
  10. vue 项目打印时去掉页眉页脚