mysql_like_%关键词%查询优化方法 :
首先: mysql缓存机制简单的说是缓存sql文本及查询结果,如果允许相同sql,服务器直接从缓存中取出结果。而不需要求解析和执行sql。 当你做任何修改时查询缓存失效。
1.查看缓存参数 show variables like ‘%query_cache%’;
variables value
have_query_cache yes –查询缓存是否可用 query_cache_limit 1048576 –查询缓存最大值 query_cache_min_res_unit 4096 query_cache_size 268435456 –查询缓存的尺寸 query_cache_type ON –阻止或支持查询缓存 query_cache_wlock_invalidate OFF 2.我们可以通过设置是否支持缓存查询 set session query_cache_type = OFF;
3.了解啦上面的知识那么对于like %关键词% 查询我们如何优化呢?
我们先来看下一个查询例子 select truename from test_1 where truename like ‘%abc%’; 第一次查询执行时间:3.9s 但第二重查询执行时间 0.016s 同样一条查询为什么会执行时间不同呢 ?这就是上面说的cache机制。 4. 所以我们在测试查询时要:
set session query_cache_type=OFF ;这样才够准确。
5. 关闭缓存查询后多次同样查询时间都是3.7s说明缓存没有起作用。
6.那么我们开始优化like %关键词% 1. 建立索引:like %关键词% 许多不支持索引 。但经过测试like 关键词%支持索引的。 2. 那么我们就会想办法把 like %关键词% 分解成 like 关键词% 在oracle等数据库中建立翻转函数索引,但mysql不支持。 所以我们就要想其它的办法。我的办法就是建立 另一个字段 把要查的关键词全部reverse(倒置) 3.给新建列赋值:update test_1 set keyword_rev=REVERSE(keyword_rev); 4.SELECT id,truename from test_1 where truename like ‘abc%’ or reverse(truename) like ‘abc%’ LIMIT 10 查询时间4.14s 并不是很快 5.采用联合查询 在建立索引的情况下 (select id,truename,truename1,myprimkey from test_1 where (truename like ‘abc%’) order by myprimkey asc LIMIT 10 ) UNION ( select id, truename,truename1 ,myprimkey from test_1 where (truename1 like REVERSE(‘%abc’ )) order by myprimkey asc LIMIT 10 ) 修改后0.062秒