人大金仓数据库学习
1. 基本介绍
人大金仓(Kingbase)是一款具有自主知识产权的商业级关系型数据库管理系统,主要特点:
- 高度兼容PostgreSQL
- 安全可控
- 具有完整的自主知识产权
- 支持国产化平台
2. MySQL迁移重点注意事项
2.1 语法差异
- 字符串使用单引号(MySQL中双引号也可以)
- 标识符使用双引号(如表名、字段名)
- 不支持LIMIT n,m语法,使用LIMIT m OFFSET n
- 自增序列使用SEQUENCE而不是AUTO_INCREMENT
2.2 数据类型对照表
MySQL数据类型 | 金仓数据类型 | 说明 |
---|---|---|
INT | INTEGER | 整型 |
DATETIME | TIMESTAMP | 时间戳 |
VARCHAR | VARCHAR | 变长字符串 |
TEXT | TEXT | 长文本 |
FLOAT | REAL | 单精度浮点 |
DOUBLE | DOUBLE PRECISION | 双精度浮点 |
3. 常用命令对照表
3.1 数据库操作
-- 查看所有数据库
MySQL: SHOW DATABASES;
金仓: \l 或 SELECT datname FROM pg_database;
-- 查看所有表
MySQL: SHOW TABLES;
金仓: \dt 或 SELECT tablename FROM pg_tables;
-- 查看表结构
MySQL: DESC table_name;
金仓: \d table_name;
3.2 序列使用
-- 创建序列
CREATE SEQUENCE seq_name
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
-- 使用序列
CREATE TABLE test_table (
id INTEGER PRIMARY KEY DEFAULT NEXTVAL('seq_name'),
name VARCHAR(100)
);
-- 获取下一个值
SELECT NEXTVAL('seq_name');
-- 获取当前值
SELECT CURRVAL('seq_name');
4. 常用管理操作
4.1 用户和权限管理
-- 创建用户
CREATE USER username WITH PASSWORD 'password';
-- 创建角色
CREATE ROLE role_name;
-- 授权
GRANT privilege ON table_name TO user_or_role;
-- 回收权限
REVOKE privilege ON table_name FROM user_or_role;
4.2 备份恢复
-- 备份数据库
kg_dump -h hostname -p port -U username -d dbname -f backup.sql
-- 恢复数据库
ksql -h hostname -p port -U username -d dbname -f backup.sql
5. 性能优化要点
5.1 索引优化
- 合理使用索引,避免过多索引
- 经常更新的字段慎用索引
- 选择性高的列适合建立索引
- 组合索引注意最左匹配原则
5.2 查询优化
- 使用EXPLAIN分析查询计划
- 避免SELECT *,只查询需要的字段
- 合理使用子查询JOIN
- 适当使用物化视图
5.3 配置优化
- shared_buffers:建议设置为系统内存的25%
- work_mem:排序和哈希操作的内存
- maintenance_work_mem:维护操作使用的内存
- effective_cache_size:系统缓存的估计值
6. 开发建议
6.1 良好习惯
- 使用SCHEMA管理表的命名空间
- 合理规划表的分区策略
- 定期进行VACUUM操作
- 重要操作使用事务保护
6.2 注意事项
- 字符串必须使用单引号
- 标识符使用双引号
- 注意大小写敏感性
- 使用参数化查询防止SQL注入
7. 常见问题解决
7.1 MySQL迁移常见陷阱
-
关键字冲突问题
- 金仓的保留字比MySQL更多,很多表名/字段名在MySQL中可用,在金仓中会报错
- 常见冲突的字段名:
user
,group
,order
,desc
,comment
,session
,date
,timestamp
- 解决方法:
- 使用双引号包裹表名/字段名:
"user"
,"group"
- 更改表名/字段名,避免使用保留字
- 使用schema前缀:
schema_name."user"
- 使用双引号包裹表名/字段名:
-
大小写敏感问题
- MySQL在Windows下默认大小写不敏感,而金仓严格区分大小写
- 建议:所有表名和字段名统一使用小写,避免混淆
- 如果必须使用大写,需要用双引号:
"UserTable"
-
自增列差异
- MySQL的AUTO_INCREMENT在金仓中不能直接使用
- 必须先创建序列(SEQUENCE),然后通过DEFAULT NEXTVAL使用
- 注意序列的所有权和权限设置
-
字符串处理
- MySQL中的字符串可以用单引号或双引号,金仓必须用单引号
- 字符串连接在MySQL中用CONCAT(),金仓使用
||
操作符 - 字符串函数名称可能不同,如:
-- MySQL SUBSTRING(str, pos, len) -- 金仓 SUBSTR(str, pos, len)
-
日期时间处理
- 日期格式差异:金仓默认使用 'YYYY-MM-DD' 格式
- 时间戳精度可能不同
- 时区处理方式不同
-
分页查询
- MySQL的 LIMIT n,m 语法在金仓中不支持
- 必须改写为 LIMIT m OFFSET n
- 例如:
-- MySQL SELECT * FROM table LIMIT 10,20; -- 金仓 SELECT * FROM table LIMIT 20 OFFSET 10;
-
函数和存储过程
- 语法差异较大,需要重写
- 变量声明和使用方式不同
- 流程控制语句可能需要调整
-
事务处理
- 默认隔离级别不同
- 锁机制有差异
- 死锁处理策略不同
7.2 连接问题
- 检查监听地址和端口配置
- 确认pg_hba.conf配置正确
- 验证用户名密码正确性
- 检查防火墙设置
7.2 性能问题
- 检查慢查询日志
- 分析EXPLAIN执行计划
- 检查系统资源使用情况
- 优化表结构和索引
8. 实用工具
- ksql:命令行客户端工具
- kg_dump:备份工具
- kg_restore:恢复工具
- kg_ctl:服务控制工具
评论区