mysql 的 like %字段% 如何优化

2016-11-04 11:10:23 +08:00
 lianxiaoyi

mysql 在 like %字段%情况下没法使用索引,现有 sql

SELECT * FROM 表 WHERE (text1=100) AND text2 LIKE "%ssss%" order by id desc LIMIT 20

在 100 多万条数据下挂了

后来改了一版

SELECT * FROM WHERE (text1=113) AND INSTR(text1, "ssss") order by id desc LIMIT 20

符合 text1 值比较少的情况下速度还行吧,但是多了之后也挂了

text1 和 text2 有联合索引

10136 次点击
所在节点    MySQL
49 条回复
enenaaa
2016-11-04 15:10:01 +08:00
@lianxiaoyi 全文搜索基于词, 如果一长串字符没有空格逗号之类的分隔符的话, 会被认作单个单词。
模糊匹配只能在字符串后面加*号, 不能加前面。
http://dev.mysql.com/doc/refman/5.7/en/fulltext-boolean.html
setonfocus
2016-11-04 15:13:22 +08:00
用 elasticsearch 吧,数据量大,绝对不能 like
lianxiaoyi
2016-11-04 15:15:16 +08:00
@enenaaa 对,如果后面带上*能查出以它开头的数据。。。。反正感觉不太适合我。。。。我放弃了。。。。
xiyangzh
2016-11-04 16:15:32 +08:00
这是典型的联合索引没起作用啊。 不要用联合索引,在 text1 上弄个索引就行, 速度上就会有质的提升。

题外话, 100w 数据真的是小 case , 如果索引得当, mysql 可以在 3 亿多的数据 20ms 内查询出结果,真实案例
sampeng
2016-11-04 16:23:17 +08:00
全文搜索 elasticsearch +1

因为部署开箱即用。。。。
chaegumi
2016-11-04 16:38:20 +08:00
@mooncakejs

我的项目中,做了一个分表,主表 MRG_MYISAM 就不能用 fulltext.
minipeach
2016-11-04 16:38:35 +08:00
@xiyangzh 有这么厉害?
skyboy
2016-11-04 17:21:09 +08:00
换 postgrelsql 试试,性能更好。
cxbig
2016-11-04 17:44:25 +08:00
这种级别用搜索引擎
ES+1

像 LIKE 或者 REGEXP 都是 debug 的时候用一下。
setonfocus
2016-11-04 17:57:14 +08:00
@xiyangzh 你不考虑并发的吗?
NeinChn
2016-11-04 18:17:50 +08:00
@xiyangzh 你这 20ms 是 TP99 么?
3 亿数据能做到全文检索还 20ms 那真的挺厉害的。
如果只是说普通的结构化查询 TP99 20ms ,那 20ms 还真不算快
kemingcao
2016-11-04 18:20:26 +08:00
配合 Elasticsearch 比较好,数据灌到里面, Like 应该轻松解决。
anuxs
2016-11-04 18:58:15 +08:00
用 es ,有插件把 MySQL 同步到 es 。
freestyle
2016-11-05 08:39:18 +08:00
@lianxiaoyi Sphinx Search 有过滤 id 的 filter 函数喔,而且速度非常快
kekeones
2016-11-05 17:45:55 +08:00
elasticsearch +1
lianxiaoyi
2016-11-05 19:00:20 +08:00
@freestyle 好像挺屌的样子!
lianxiaoyi
2016-11-05 19:01:18 +08:00
@anuxs 我再研究研究! mysql 真脆!玩着玩着服务就起不来了!
lianxiaoyi
2016-11-05 19:01:57 +08:00
@kemingcao 嘿嘿!程序猿都比较懒!
fox0001
2016-11-06 10:06:37 +08:00
可以考虑全文索引。或者新建一个字段,把 text2 中的关键字抠出来
xiyangzh
2016-11-07 16:19:12 +08:00
@NeinChn 我说的 20ms 是普通的结构化查询。

纠正你一点,普通的结构化查询要在亿级的数据做到 20ms 一下也是很困难的。
给你一个真实案例, 2kw 级的数据, 根据 id 查询, mysql 都需要 17ms 。

你想么, 2kw 的数据,根据主键查询都得 20ms 左右, 何况上亿级别了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/317970

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX