注:不用新建表,查询性能高,可以兼容中英文

简单分析

应用场景:通常对地址或者数量较多的分类会选择首字母查询的方法

性能考虑:PHP中进行首字母查询,网上可以找到很多脚本实现,但需要将所有数据进行读出,在PHP代码中进行筛选,个人认为性能存在问题

数据库:SQL Server有对应的存储过程能实现到首字母查询,我日常工作主要使用的是Mysql,所以就对Mysql进行了一番操作

原理:其实首字母查询的原理大致相同,中文都是通过GBK下的ASNII码进行查询,这个和GBK编码的制定有关

目前大多数针对Mysql的方案还会选择建立一张字符编码表,用来解析首字母的关系,该操作在查询中是会读取全表的,性能肯定得不到满足

实际问题需考虑

Mysql所需查询对应表的编码,通过原理知道需要的是GBK编码,所以当数据库是UTF-8等其他编码时需要进行转换

所需查询的数据中是否有英文,因为英文的首字母查询规则不是一样的,需要特殊操作下

就是通过Mysql的函数实现对字段的首个字符进行ASNII编码判断

首先放上最终的语句

select * FROM table where (ord(CONVERT(field USING gbk)) = 对应大写编码 or ord(CONVERT(field USING gbk)) = 对应小写编码 or ((ord(CONVERT(field USING gbk))-65535) >=初始范围 and (ord(CONVERT(field USING gbk))-65535) <= 结束范围 ))

分析以上语句:(基本语法不分析)

ord(CONVERT(field USING gbk)):

进行编码转换并获取首个字符的ASNII码

如果表本身就是gbk编码,则可以写成:(ord(field))

4个判断

对应大写编码,对应小写编码:主要针对表中是否有英文需求,只需相等即可

初始范围,结束范围:针对中文需求,需要在2个数值之间

根据自己的需求确定实际语句

获取以上的4个的值:这边我写了PHP函数用来处理该问题

/*

Start: 初始范围

End: 结束范围

Da:大写编码

Xiao:小写编码

*/

function getcharnum($str){

$str = strtoupper($str) ;//将字母转换成大写,因为下面是对大写字母判断

switch($str){

case 'A':

$return_arr=array('start'=>'-20319','end'=>'-20284','da'=>'65','xiao'=>'97');

break;

case 'B':

$return_arr=array('start'=>'-20283','end'=>'-19776','da'=>'66','xiao'=>'98');

break;

case 'C':

$return_arr=array('start'=>'-19775','end'=>'-19776','da'=>'67','xiao'=>'99');

break;

case 'D':

$return_arr=array('start'=>'-19218','end'=>'-18711','da'=>'68','xiao'=>'100');

break;

case 'E':

$return_arr=array('start'=>'-18710','end'=>'-18527','da'=>'69','xiao'=>'101');

break;

case 'F':

$return_arr=array('start'=>'-18526','end'=>'-18240','da'=>'70','xiao'=>'102');

break;

case 'G':

$return_arr=array('start'=>'-18239','end'=>'-17923','da'=>'71','xiao'=>'103');

break;

case 'H':

$return_arr=array('start'=>'-17922','end'=>'-17418','da'=>'72','xiao'=>'104');

break;

case 'J':

$return_arr=array('start'=>'-17417','end'=>'-16475','da'=>'74','xiao'=>'106');

break;

case 'K':

$return_arr=array('start'=>'-16474','end'=>'-16213','da'=>'75','xiao'=>'107');

break;

case 'L':

$return_arr=array('start'=>'-16212','end'=>'-15641','da'=>'76','xiao'=>'108');

break;

case 'M':

$return_arr=array('start'=>'-15640','end'=>'-15166','da'=>'77','xiao'=>'109');

break;

case 'N':

$return_arr=array('start'=>'-15165','end'=>'-14923','da'=>'78','xiao'=>'110');

break;

case 'O':

$return_arr=array('start'=>'-14922','end'=>'-14915','da'=>'79','xiao'=>'111');

break;

case 'P':

$return_arr=array('start'=>'-14914','end'=>'-14631','da'=>'80','xiao'=>'112');

break;

case 'Q':

$return_arr=array('start'=>'-14630','end'=>'-14150','da'=>'81','xiao'=>'113');

break;

case 'R':

$return_arr=array('start'=>'-14149','end'=>'-14091','da'=>'82','xiao'=>'114');

break;

case 'S':

$return_arr=array('start'=>'-14090','end'=>'-13319','da'=>'83','xiao'=>'115');

break;

case 'T':

$return_arr=array('start'=>'-13318','end'=>'-12839','da'=>'84','xiao'=>'116');

break;

case 'W':

$return_arr=array('start'=>'-12838','end'=>'-12557','da'=>'87','xiao'=>'119');

break;

case 'X':

$return_arr=array('start'=>'-12556','end'=>'-11848','da'=>'88','xiao'=>'120');

break;

case 'Y':

$return_arr=array('start'=>'-11847','end'=>'-11056','da'=>'89','xiao'=>'121');

break;

case 'Z':

$return_arr=array('start'=>'-11055','end'=>'-10247','da'=>'90','xiao'=>'122');

break;

default:

return false;

}

return $return_arr;

}

$array = getcharnum(‘a’);

//通过获取对应首字母的4个编码,填入对应SQL语句中即可实现首字母查询

性能上:

Myqsl对于ord的判断十分的快速

5W条数据在对应字段添加索引的情况下,响应时间在0.00x秒总的来说不慢

mysql 拼音首字母_Mysql:拼音首字母查询(超高性能)相关推荐

  1. db2有MySQL那样的时间戳_MySQL 按照日期格式查询带有时间戳数据

    按照日期格式查询带有时间戳数据一般在MSQL数据库中的时间都是以时间戳的格式来存储时间的,但是对于我们来说,时间戳格式具体表示的是什么时间,我们很难一眼看出来,所以当我们要具体查询某一个时间或时间段的 ...

  2. mysql范围查找性能_MYSQL(四)查询性能优化

    优化数据访问 1.是否向数据库请求了不需要的数据 解决方式: A. 查询后加limit B. Select后写需要的列而不是* 2. 是否扫描了额外的数据 数据库的访问方式速度由慢到快:全表扫描,索引 ...

  3. mysql 拼音首字母_MySQL拼音首字母查询(支持三个中文以内的查询)

    #参考这篇博客:http://blog.csdn.net/naruto1021/article/details/17502783,不过这个只支持查询一个中文字母,这是不太符合我的要求,改写如下: 如果 ...

  4. any在mysql语句中用法_MySQL中,子查询中可以使用运算符ANY,它表示的意思是______。...

    MySQL中,子查询中可以使用运算符ANY,它表示的意思是______. 答:至少一个值满足条件 以下能对一维数组a进行正确初始化的语句是[ ] 答:int a[ ]={0; int a[10]={1 ...

  5. mysql一对多代码_MySQL实现一对多查询的代码示例

    本篇文章给大家带来的内容是关于MySQL实现一对多查询的代码示例,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 这次要实现的是一对多查询,使用 MySQL 的 group_conca ...

  6. mysql多表 性能_Mysql 多表联合查询效率分析及优化

    1. 多表连接类型 1. 笛卡尔积(交叉连接)在MySQL中可以为CROSS JOIN或者省略CROSS即JOIN,或者使用','  如: SELECT*FROMtable1CROSSJOINtabl ...

  7. mysql 通配符转转义_MySQL中的模糊查询和通配符转义

    MySQL中实现模糊查询有2种方式:一是用LIKE/NOT LIKE,二是用REGEXP/NOT REGEXP(或RLIKE/NOT RLIKE,它们是同义词). 第一种是标准的SQL模式匹配.它有2 ...

  8. mysql 添加索引卡死_mysql添加索引,查询反而变慢

    依照楼主的数据,我也造了400万数据: mysql> select * from index_test limit 5; id1 id2 11111 11111 22222 22222 1111 ...

  9. mysql 查看数据库函数_MySQL数据库中常用查询函数简介

    MYSQL中的常用函数 count(*)--- 相当于统计表的行数,在统计结果的时候,不会忽略列值为NULL的记录. select count(*) from yinxiong; Count(列名) ...

  10. mysql select 指定列_MySQL使用select语句查询指定表中指定列(字段)的数据

    本文介绍mysql数据库中执行select查询语句,查询指定列的数据,即指定字段的数据. 再来回顾一下sql语句中的select语句的语法: select 语句的基本语法: select from w ...

最新文章

  1. 人人都应该掌握的9种数据分析思维
  2. 油井在哪_身边榜样 | 张景岗:“油井越‘生气,自己越开心”
  3. 【机器学习】快速入门简单线性回归 (SLR)
  4. java重新初始化吗_Java中为何已经重新赋值的变量在输出后会初始化?
  5. 用java雷电游戏_Java实现仿雷电游戏
  6. 天池在线编程 2020国庆八天乐 - 7 进制
  7. android底部导航栏软件,三步搞定android应用底部导航栏
  8. pyqt 取鼠标处文字_爱剪辑:炫彩的动态标题文字特效,这招让视频片头LOGO更酷炫...
  9. spark学习-75-源代码:Endpoint模型介绍(6)-Endpoint的消息的接收(2)
  10. 关于margin的数值是百分比,参照对象
  11. svn中文语言包安装(内含语言包路径)
  12. 虚拟光驱 DAEMON Tools Lite 安装笔记
  13. 如何建立高效的需求管理机制?
  14. 1stopt(应用集锦)
  15. 进程管理(一)--进程管理的基本概念
  16. 计算机信息检索技术实质上是逻辑运算,在信息检索的实际过程中,如需要扩大检索范围时,如何调整检索策略...
  17. Python编程:从入门到实践.pdf :Python 基础笔记,最基本的 Python语法,快速上手入门 Python
  18. 微信支付服务商接入指引
  19. Impala graceful shutdown功能介绍
  20. FPGA实现DDRIP核配置(Memory Interface Solutions)

热门文章

  1. 【转】struts1的struts-config.xml的配置说明
  2. Linux系统学习之 三:新手必须掌握的Linux命令3
  3. 神经网络----笔记(1)
  4. SmartDial - 简单你的生活
  5. 只有在配置文件或 Page 指令中将 enableSessionState”的异常解决办法
  6. Socket I/O模型全接触
  7. cocos2d-x性能优化的那些事
  8. MFC工作笔记0010---PeekMessage 详解
  9. MQTT工作笔记0003---产品和设备
  10. Netty工作笔记0002---Netty的应用场景