mysql 拼音首字母_Mysql:拼音首字母查询(超高性能)
注:不用新建表,查询性能高,可以兼容中英文
简单分析
应用场景:通常对地址或者数量较多的分类会选择首字母查询的方法
性能考虑: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:拼音首字母查询(超高性能)相关推荐
- db2有MySQL那样的时间戳_MySQL 按照日期格式查询带有时间戳数据
按照日期格式查询带有时间戳数据一般在MSQL数据库中的时间都是以时间戳的格式来存储时间的,但是对于我们来说,时间戳格式具体表示的是什么时间,我们很难一眼看出来,所以当我们要具体查询某一个时间或时间段的 ...
- mysql范围查找性能_MYSQL(四)查询性能优化
优化数据访问 1.是否向数据库请求了不需要的数据 解决方式: A. 查询后加limit B. Select后写需要的列而不是* 2. 是否扫描了额外的数据 数据库的访问方式速度由慢到快:全表扫描,索引 ...
- mysql 拼音首字母_MySQL拼音首字母查询(支持三个中文以内的查询)
#参考这篇博客:http://blog.csdn.net/naruto1021/article/details/17502783,不过这个只支持查询一个中文字母,这是不太符合我的要求,改写如下: 如果 ...
- any在mysql语句中用法_MySQL中,子查询中可以使用运算符ANY,它表示的意思是______。...
MySQL中,子查询中可以使用运算符ANY,它表示的意思是______. 答:至少一个值满足条件 以下能对一维数组a进行正确初始化的语句是[ ] 答:int a[ ]={0; int a[10]={1 ...
- mysql一对多代码_MySQL实现一对多查询的代码示例
本篇文章给大家带来的内容是关于MySQL实现一对多查询的代码示例,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 这次要实现的是一对多查询,使用 MySQL 的 group_conca ...
- mysql多表 性能_Mysql 多表联合查询效率分析及优化
1. 多表连接类型 1. 笛卡尔积(交叉连接)在MySQL中可以为CROSS JOIN或者省略CROSS即JOIN,或者使用',' 如: SELECT*FROMtable1CROSSJOINtabl ...
- mysql 通配符转转义_MySQL中的模糊查询和通配符转义
MySQL中实现模糊查询有2种方式:一是用LIKE/NOT LIKE,二是用REGEXP/NOT REGEXP(或RLIKE/NOT RLIKE,它们是同义词). 第一种是标准的SQL模式匹配.它有2 ...
- mysql 添加索引卡死_mysql添加索引,查询反而变慢
依照楼主的数据,我也造了400万数据: mysql> select * from index_test limit 5; id1 id2 11111 11111 22222 22222 1111 ...
- mysql 查看数据库函数_MySQL数据库中常用查询函数简介
MYSQL中的常用函数 count(*)--- 相当于统计表的行数,在统计结果的时候,不会忽略列值为NULL的记录. select count(*) from yinxiong; Count(列名) ...
- mysql select 指定列_MySQL使用select语句查询指定表中指定列(字段)的数据
本文介绍mysql数据库中执行select查询语句,查询指定列的数据,即指定字段的数据. 再来回顾一下sql语句中的select语句的语法: select 语句的基本语法: select from w ...
最新文章
- 人人都应该掌握的9种数据分析思维
- 油井在哪_身边榜样 | 张景岗:“油井越‘生气,自己越开心”
- 【机器学习】快速入门简单线性回归 (SLR)
- java重新初始化吗_Java中为何已经重新赋值的变量在输出后会初始化?
- 用java雷电游戏_Java实现仿雷电游戏
- 天池在线编程 2020国庆八天乐 - 7 进制
- android底部导航栏软件,三步搞定android应用底部导航栏
- pyqt 取鼠标处文字_爱剪辑:炫彩的动态标题文字特效,这招让视频片头LOGO更酷炫...
- spark学习-75-源代码:Endpoint模型介绍(6)-Endpoint的消息的接收(2)
- 关于margin的数值是百分比,参照对象
- svn中文语言包安装(内含语言包路径)
- 虚拟光驱 DAEMON Tools Lite 安装笔记
- 如何建立高效的需求管理机制?
- 1stopt(应用集锦)
- 进程管理(一)--进程管理的基本概念
- 计算机信息检索技术实质上是逻辑运算,在信息检索的实际过程中,如需要扩大检索范围时,如何调整检索策略...
- Python编程:从入门到实践.pdf :Python 基础笔记,最基本的 Python语法,快速上手入门 Python
- 微信支付服务商接入指引
- Impala graceful shutdown功能介绍
- FPGA实现DDRIP核配置(Memory Interface Solutions)