mysql_like_%关键词%查询优化方法

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秒

Comments

No comments yet. Why don’t you start the discussion?

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注