加快mysql模糊搜索_mysql优化模糊搜索查询

对于模糊查询语句,最不利的情况是要like '%key%'这样的查询,但是如果是like 'key%'这种情况,那么mysql的索引在些查询方式上还是可以优化的。

网上常见的是ASCII的英文字符优化,如下:

select corp_code, corp_corp from tb_Z_Corp where corp_code like '0008%';

举个例子来看看问题的来源吧:

先看一下要试验表的创建语句和结构,这是一个只包含股票代码和股票名称的数据表,主键为股票代码:

mysql> show create table tb_Z_Corp;

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

| Table | Create Table |

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

| tb_Z_Corp | CREATE TABLE `tb_Z_Corp` (

`corp_code` char(10) NOT NULL,

`corp_corp` varchar(60) NOT NULL,

PRIMARY KEY (`corp_code`),

KEY `idx_Z_Corp_corp_corp` (`corp_corp`)

) ENGINE=MyISAM DEFAULT CHARSET=utf8 |

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

mysql> desc tb_Z_Corp;

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

| Field | Type | Null | Key | Default | Extra |

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

| corp_code | char(10) | NO | PRI | | |

| corp_corp | varchar(60) | NO | MUL | | |

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

表里面的数据举例如下(股票代码和股票名称):

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

| corp_code | corp_corp |

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

| 000800 | 一汽轿车 |

| 000801 | 四川九洲 |

| 000802 | 北京旅游 |

| 000803 | 金宇车城 |

| 000805 | *ST炎黄 |

| 000806 | 银河科技 |

| 000807 | 云铝股份 |

| 000809 | 中汇医药 |

看一下要待优化的语句(一个英文、一个中文的):

select corp_code, corp_corp from tb_Z_Corp where corp_code like '0008%';

select corp_code, corp_corp from tb_Z_Corp where corp_corp like '江%';

对于第一个待优化的SQL语句来说,比较简单,很多地方都介绍过怎样优化:

select corp_code, corp_corp from tb_Z_Corp where corp_code >= '0008' and corp_code < '0009';

而对于第二个是中文字符,马上想到是加一个最大编码的汉字,这里数据库存储的是UTF-8格式存储,而汉字的编码为3字节,所以按其最大编码的规则应该是:

Unicode编码是从U+0800到U+FFFF先标记一下这16位:“zzzzyyyy yyxxxxxx”;

然后把这16位对应到UTF-8的编码:“1110zzzz 10yyyyyy 10xxxxxx”。

所以最大的3个字节的编码为“11101111 10111111 10111111”,也就是十六进制的“EFBFBF”。

在MySQL中,用x'EFBFBF'表明这里面是用16进制编码的字符串,所以我们优化后的语句应该是这样的:

select corp_code, corp_corp from tb_Z_Corp where corp_corp >= '江' and corp_corp < CONCAT('江', x'EFBFBF');

这样就达到了不用like语句比较表中的每一条记录,而直接使用索引快速检索。看,结果出来了:

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

| corp_code | corp_corp |

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

| 600750 | 江中药业 |

| 002226 | 江南化工 |

| 601199 | 江南水务 |

| 000519 | 江南红箭 |

| 600527 | 江南高纤 |

| 002061 | 江山化工 |

| 600389 | 江山股份 |

| 600212 | 江泉实业 |

| 002484 | 江海股份 |

| 000816 | 江淮动力 |

| 600418 | 江淮汽车 |

| 002176 | 江特电机 |

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值