转 http://blog.csdn.net/firstboy0513/article/details/6912632mysql
利用MySQL这种关系型数据库来作索引,的确有些勉强了,也只能看状况来讲了,有些简单的功能仍是能够考虑的。sql
对于模糊查询语句,最不利的状况是要like '%key%'这样的查询,可是若是是like 'key%'这种状况,那么mysql的索引在些查询方式上仍是能够优化的。数据库
网上常见的是ASCII的英文字符优化,以下:优化
- select corp_code, corp_corp from tb_Z_Corp where corp_code like '0008%';
举个例子来看看问题的来源吧:编码
先看一下要试验表的建立语句和结构,这是一个只包含股票代码和股票名称的数据表,主键为股票代码:spa
- 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 | | |
- +
表里面的数据举例以下(股票代码和股票名称):.net
- +
- | corp_code | corp_corp |
- +
- | 000800 | 一汽轿车 |
- | 000801 | 四川九洲 |
- | 000802 | 北京旅游 |
- | 000803 | 金宇车城 |
- | 000805 | *ST炎黄 |
- | 000806 | 银河科技 |
- | 000807 | 云铝股份 |
- | 000809 | 中汇医药 |
看一下要待优化的语句(一个英文、一个中文的):code
- 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语句来讲,比较简单,很多地方都介绍过怎样优化:blog
- 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 | 江特电机 |