`

mysql模糊查询

 
阅读更多
利用mysql这种关系型数据库来做索引,的确有些勉强了,也只能看情况来说了,有些简单的功能还是可以考虑的。

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

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

  view plain select corp_code, corp_corp from tb_Z_Corp where corp_code like '0008%';举个例子来看看问题的来源吧:

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

  view plain 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 |         |       | +——+——+——+——+——+——+表里面的数据举例如下(股票代码和股票名称):

  view plain +——+——+ | corp_code | corp_corp    | +——+——+ | 000800    | 一汽轿车     | | 000801    | 四川九洲     | | 000802    | 北京旅游     | | 000803    | 金宇车城     | | 000805    | *ST炎黄      | | 000806    | 银河科技     | | 000807    | 云铝股份     | | 000809    | 中汇医药     |看一下要待优化的语句(一个英文、一个中文的):

  view plain 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语句来说,比较简单,很多地方都介绍过怎样优化:

  view plain 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进制编码的字符串,所以我们优化后的语句应该是这样的:

  view plain select corp_code, corp_corp from tb_Z_Corp where corp_corp >= '江' and corp_corp < CONCAT('江', x'EFBFBF');这样就达到了不用like语句比较表中的每一条记录,而直接使用索引快速检索。看,结果出来了:

  view plain +——+——+ | corp_code | corp_corp    | +——+——+ | 600750    | 江中药业     | | 002226    | 江南化工     | | 601199    | 江南水务     | | 000519    | 江南红箭     | | 600527    | 江南高纤     | | 002061    | 江山化工     | | 600389    | 江山股份     | | 600212    | 江泉实业     | | 002484    | 江海股份     | | 000816    | 江淮动力     | | 600418    | 江淮汽车     | | 002176    | 江特电机     |



查询不包含关键词的语句
select * from tableA where tab not like '%abc%'
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics