xSky 实验室关注高性能计算,分布式系统/存储,大数据/机器学习/WebRTC
目录
  • 首页
  • 技术相关
  • 原创作品
  • 人工智能/机器学习
  • 系统与架构
  • 数据库/数据分析
  • 分布式系统/存储
  • 服务端开发
  • WEBRTC研究
  • 开发调试
  • 网络与安全
  • 常用工具
  • 杂七杂八

mysql存储过程使用心得

2018-04-11 04:23:40

由于经常跟MYSQL数据库打交道,在工作中因为各种需要写了一些存储过程,

这里把平时使用存储过的心得体会写一下:
1.MYSQL存储函数
mysql存储过程以是SQL语言开发的,SQL语言平时使用中最常用的就是 UPDATE,INSERT/REPLACE,DELETE
等了,但是,由于MYSQL 提供了很多内部函数,因此,结合SQL语言,我们可以实现很多功能。
比如,有的时候,我们需要对某个字段进行使用某个HASH函当选,一般来说我们都是通过外部程序编写代码实现
hash函数,处理好后再交给MYSQL进行操作。
当然如果对性能要求不是那么高的话,我们可以使用MYSQL存储函数来实现,可以简化对数据的操作,直接使用SQL就可以了,
省去了外部脚本的开发。
unsigned long ELFHash(const char *key)
{
unsigned long h = 0;
unsigned long x = 0;
while (*key)
{
h = (h << 4) + (*key++);
if ((x = h & 0xF0000000L) != 0)
{
h ^= (x >> 24);
h &= ~x;
}
}
return (h & 0x7FFFFFFF);
}
这里是 ELFHash 的SQL实现:
CREATE DEFINER=`test`@`127.0.0.1` FUNCTION `elfhash`(strkey varchar(256)) RETURNS int(11)
NO SQL
BEGIN

DECLARE h INT UNSIGNED DEFAULT 0;
DECLARE x INT UNSIGNED DEFAULT 0;
DECLARE k INT UNSIGNED DEFAULT 0;
DECLARE strLen INT UNSIGNED DEFAULT 0;
DECLARE pos INT UNSIGNED DEFAULT 0;
DECLARE cc char(1) DEFAULT NULL;

SELECT LENGTH(strkey)+1 INTO strLen ;

WHILE (pos<strLen) DO
set k = ASCII(MID(strkey,pos,1));
set h = (h << 4) + k;
SET x = h & 0xF0000000;
IF (x!= 0) THEN
set h = h^(x >> 24);
set h = h&(~x);
END IF;

SET pos = pos +1;
END WHILE;

SET h = h & 0x7FFFFFFF;
RETURN h;
END

2. 在SQL里使用一些内部函数,可以实现一些比较有用的功能,
比如,MYSQL提供的BIT类型长度有限,最大只能是64位,
如果需要操作大于64位的BITARRY,MYSQL提供的类型就不能满足了。
这时我们可以使用存储函数来模拟一个大于64位的BITARRY

# 取得某一位的值
CREATE DEFINER=`ttuser`@`116.228.188.74` FUNCTION `getbitarry`(aStatus varchar(22), aTaskID int) RETURNS int(11)
NO SQL
BEGIN
#Routine body goes here...

RETURN MID(aStatus,aTaskID,1);
END


# 给BIT位赋值
CREATE DEFINER=`ttuser`@`116.228.188.74` FUNCTION `setbitarray`(aStatus varchar(22), aTaskID int, aflag int) RETURNS varchar(22) CHARSET utf8
NO SQL
BEGIN
#Routine body goes here...
SET aStatus = CONCAT(MID(aStatus, IF(aflag,1,0), aTaskID-1), aflag, MID(aStatus, aTaskID+1, LENGTH(aStatus)-aTaskID));
RETURN aStatus;
END


CREATE TABLE `t_test` (
`Fid` int(11) NOT NULL,
`Fstatus` varchar(22) NOT NULL DEFAULT '',
PRIMARY KEY (`Fid`,`Fstatus`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

UPDATE t_test SET Fstatus = setbitarray(Fstatus, 4, 1) ;
SELECT *, getbit(Fstatus,1), getbit(Fstatus,2) FROM t_test;



3. mysql存储过程里的拼SQL问题:

很多时候由于数据库被分库分表,在写存储过程的时候,库表名就需要动态生成, 简单的用set或者declare语句定义变量,然后直接作为sql的表名是不行的,mysql会把变量名当作表名。解决方法是将整条sql语句作为变量,其中穿插变量作为表名,
然后用 prepare stmt 语句执行。

SET @sqlStr = CONCAT('SELECT COUNT(DISTINCT TABLE_SCHEMA) FROM information_schema.TABLES WHERE TABLE_SCHEMA=\'',
@strDBname, '\' AND TABLE_NAME=\'', @strTBname,'\' INTO @nCount');
SELECT @sqlStr;
prepare stmt from @sqlStr;EXECUTE stmt;DEALLOCATE prepare stmt;

预处理语句的SQL语法可以在存储过程中使用,但是不能在存储函数或触发程序中使用。

 

4. clickhouse使用case when实现区间查询

select user.age_range as age,count(distinct user.cuid) as count
from (
select
cuid,
case
when age>='18' and age<='24' then '18-24岁'
when age>='25' and age<='29' then '25-29岁'
when age>='30' and age<='34' then '30-34岁'
when age>='35' then '35-100岁'
end as age_range
from
person
where
has(professional, 'student')
and
has(sex, '男')
) user group by age_range

By:xSky | 数据库/数据分析 |

  • 分类目录

    • 技术相关 (35)
    • 原创作品 (13)
    • 人工智能/机器学习 (6)
    • 系统与架构 (9)
    • 数据库/数据分析 (11)
    • 分布式系统/存储 (4)
    • 服务端开发 (7)
    • WEBRTC研究 (7)
    • 开发调试 (7)
    • 网络与安全 (9)
    • 常用工具 (9)
    • 杂七杂八 (6)
  • 最新文章

    • 嵌入式分析型数据库(DuckDB)
    • WSL从C盘迁移到其他盘区
    • 赵何娟:中国AI追随之路的五大误区,我们至少落后十年
    • zap  发送日志到 websocket
    • QUIC(隐藏的)超能力
    • MYSQL 生成日期/时间序列总结
    • Linux bash终端设置代理(proxy)访问
    • centos 下 yum安装python3
    • 使用SQL查询Milvus 向量数据库
    • 浅谈 MySQL 新的身份验证插件 caching_sha2_password
    • Milvus v2.2.1 开源向量搜索引擎使用教程
    • 部署了一个SRS的demo
    • Dockerfile 详解
    • Docker常用命令
    • Tus文件上传协议
    • 编译运行Milvus
    • MinIO 快速入门
    • ESP32
    • Prometheus监控报警系统搭建
    • go语言JSON字典模拟
    • go语言的sql解析器
    • Grafana配置数据源,自定义查询语法
    • TDengine + Telegraf + Grafana
    • gRPC-Gateway 返回JSON数据int64类型被转为string类型问题
    • LLAMA模型试玩
    • 语音识别的一些开源项目整理
    • 使用MYSQL8进行统计分析
    • 记录FFmpeg抽帧、合流、转码、加水印等操作
    • 移动网络弱网处理研究
    • 翻译:使用 Semgrep 进行热点代码评审
  • 链接

    • xSky的Blog
    • 我的Github
    • 实时监控图表
    • 预印本
    • xRedis 在线文档
    • xSkyProxy
    • xChart 数据在线测试
    • 我的电子书
    • xChart 数据可视化系统
    • 树莓派技术圈
    • WebRTC开发者社区
  • 开源项目

    • xReis C++的redis客户端库
    • xBlog-C++ 博客程序
    • xSkyProxy-新型MySQL代理网关
    • 数据可视化平台- xChart
    • xhttpcache 高速数据缓存服务
    • xMonitor-图形监测工具
    • 网址收集

Powered By xBlog

Copyright 2010~2024 0xsky.com All Rights Reserved.