利用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%'
分享到:
相关推荐
MySQL模糊查询语法 MySQL模糊查询语法 MySQL模糊查询语法
Mysql 时间模糊查询,不同场景的查询方式,根据条件查询
MySQL模糊查询语法[文].pdf
这是我在用php结合MySQL数据库写动态网站时,为了是网站高大上琢磨写的一个动态查询,希望能够给需要的人提供帮助,我是个新手哦。
sql中经常用like进行模糊查询,而模糊查询就要用到百分号“%”,下划线“_”这些通配符,其中“%”匹配任意多个字符,“_”匹配单个字符。如果我们想要模糊查询带有通配符的字符串,如“60%”,“user_name”,就...
每位程序员们应该都知道,增删改查是mysql最基本的功能,而其中查是最频繁的操作,模糊查找是查询中非常常见的操作,...下面这篇文章就给大家详细介绍了mysql模糊查询like与REGEXP的使用,有需要的朋友们可以参考学习。
相应描述mysql使用的sql命令,包括模糊查询和索引,函数等等 平常会使用到的sql都会有
。。。
。。。
在本篇文章里小编给大家分享的是一篇关于MySQL模糊查询语句整理内容,有兴趣的朋友们可以学习下。
mysql数据表模糊查询
主要介绍了mysql中模糊查询的四种用法,需要的朋友可以参考下
...
。。。
mysql 中文 模糊搜索 不精确 解决办法
主要介绍了Mybatis使用MySQL模糊查询时输入中文检索不到结果的解决办法的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
Python使用sql语句对mysql数据库多条件模糊查询
原创 百度 Google 搜索 提示 ajax 模糊查询 JavaScript jsp 最简单的Demo。 用记事本仿数据库中的数据,输入一个字后,会自动加载匹配的信息。有动态效果。
千万级Mysql-MongoDB性能对比报告
C#实现拼音模糊查询,可只输入一个字母就可查询出完整的字段