like语句(全/右)模糊查询优化

like语句(全/右)模糊查询优化

优化思路:

1)由于like 'xxx%' 形式是能够用索引的,因此将like '%xxx%' 转为 正反值的like 'xxx%' ;
2)利用冗余数据解决速度问题;ide

一、原始SQL

SELECT COUNT('*') AS `__count` 
FROM `t_mytest_userinfo` 
WHERE (`c_is_delete` = 0 
AND `c_company_id` = 'e0b5df9cb47646ee8cd97237b838e35e' 
AND (`c_emp_name` LIKE '%张三疯%' )
)

二、优化前

有个 姓名 列,原来查询是下面这样得:函数

`c_emp_name` LIKE '%张三疯%'

三、优化

1)在表里新增一列c_emp_name_re,存放姓名反转以后得值,好比 '张三' 反转后 '三张';优化

2)对历史数据生成反转值code

UPDATE t_mytest_userinfo SET c_emp_name_re=REVERSE(c_emp_name)

备注: reverse()函数能够反转字符串索引

3)而后分别在2个姓名列上创建索引字符串

ALTER TABLE `t_mytest_userinfo`
ADD INDEX idx_ename_com (c_emp_name,c_company_id),
ADD INDEX idx_enamer_com (c_emp_name_re,c_company_id)

4)改写SQL条件it

`c_emp_name` LIKE '张三疯%' OR `c_emp_name_re` LIKE '疯三张%'

四、验证

1)优化前 io

SELECT COUNT('*') AS `__count` 
FROM `t_mytest_userinfo` 
WHERE (`c_is_delete` = 0 
AND `c_company_id` = 'e0b5df9cb47646ee8cd97237b838e35e' 
AND (`c_emp_name` LIKE '%张三疯%' )
)

执行计划:table

id  select_type  table              type    possible_keys      key                key_len  ref            rows  Extra                               
------  -----------  -----------------  ------  -----------------  -----------------  -------  -----------  ------  ------------------------------------
     1  SIMPLE       t_mytest_userinfo  ref     ix_delete_company  ix_delete_company  99       const,const  517170  Using index condition; Using where

执行耗时 : 14.776 sec
传送时间 : 0.001 sec
总耗时 : 14.777 secclass

2)优化后:

SELECT COUNT('*') AS `__count` 
FROM `t_mytest_userinfo` 
WHERE (`c_is_delete` = 0 
AND `c_company_id` = 'e0b5df9cb47646ee8cd97237b838e35e' 
AND (`c_emp_name` LIKE '张三疯%' OR `c_emp_name_re` LIKE '疯三张%') )

执行计划:

id  select_type  table              type         possible_keys                                   key                           key_len  ref       rows  Extra                                                        
------  -----------  -----------------  -----------  ----------------------------------------------  ----------------------------  -------  ------  ------  -------------------------------------------------------------
     1  SIMPLE       t_mytest_userinfo  index_merge  ix_delete_company,idx_ename_com,idx_enamer_com  idx_ename_com,idx_enamer_com  138,138  (NULL)       8  Using sort_union(idx_ename_com,idx_enamer_com); Using where

执行耗时 : 0.007 sec
传送时间 : 0.003 sec
总耗时 : 0.011 sec

完毕!

相关文章
相关标签/搜索