什么是Chat2DB?
Chat2DB 是一款有开源免费的多数据库客户端工具,支持windows、mac本地安装,也支持服务器端部署,web网页访问。和传统的数据库客户端软件Navicat、DBeaver 相比Chat2DB集成了AIGC的能力,能够将自然语言转换为SQL,也可以将SQL转换为自然语言,可以给出研发人员SQL的优化建议,极大的提升人员的效率,是AI时代数据库研发人员的利器,未来即使不懂SQL的运营业务也可以使用快速查询业务数据、生成报表能力
下载安装
Chat2DB项目地址: github
Chat2DB客户端:官网下载地址
项目结构
- 拉取项目
本次在使用git克隆项目时,报了一个错误,无法拉取项目
OpenSSL SSL_read: Connection was reset, errno 1005 ,经过查询资料使用以下命令解决,在桌面打开Bash Here 输入以下命令:
git config --global --unset https.proxy
再重新拉取项目即可解决
2. 打包工程
在使用命令
mvn clean install
打包项目时会报以下错误,无效的标记
原因:要求项目jdk是17,maven版本高于3.8
将项目导入至编译工具中,更改项目jdk版本,以idea为例,找到Project Structure->Project
大部分人的电脑上可能只有一个jdk,由于项目要求不同,可以建议大家多安装几个版本的jdk,只用切换环境变量即可满足,用到那个版本,path里的变量名称改成那个版本即可,maven同理
3. 启动服务端
打包成功后,使用命令启动服务端
java -jar -Dchatgpt.apiKey=XXX chat2db-server-start.jar
apiKey是必须要的参数,xxx就是你的ApiKey(后续有介绍)
其他博客给的启动命令为:
java -jar -Dloader.path=./lib -Dchatgpt.apiKey=xxxxx chat2db-server-start.jar
这里发现多了一个参数-Dloader.path=./lib,这个参数的意思大概就是项目中所需要的其他jar包,但是这里的项目工程里没有这个lib目录,因此不需要这个参数。
安装&使用客户端
- 客户端是一个可执行文件,正常安装即可。
- 安装后可以设置语言,支持中英文。
- 设置AI,这个软件的特殊之处就是AI这里需要用到OpneAi(这个东西是干嘛的本次内容不再介绍,不清楚的同学自行了解),没有账号或者不知道怎么获取账号的同学不用担心,Chat2DB的作者提供了一个免费的AI(是作者自己实现的AI推荐使用),一天只能使用100次。关注公众号“Ch2DB” ,发送AI即可获取。
- 服务端地址,你的服务部署在哪里就写哪里的ip即可,本地部署就不用管,端口没被占用的话也不用改,服务端还支持docker部署,有兴趣的同学可以自行了解
- 创建连接,使用和Navicat相似。选择自己的数据库即可
连接成功后,点击新建控制台,在最上面写入白话文,如查询小明的总成绩,勾选相关表,点击坐标的回车按钮即可生成sql
效果如下图:
也可以在下方输入框中选中右键
可以对sql进行解释,优化sql建议,将白话文转成sql等功能,
解释sql:
SELECT score.score
FROM score
INNER JOIN student_course ON score.course_id = student_course.course_id
INNER JOIN student ON student_course.student_id = student.id
WHERE student.name = '小明'
#解释
这个SQL语句的目的是从三个表中(score, student_course, student)查询并返回满足特定条件的数据。具体步骤如下: 1. FROM子句指定了我们要查询的表,即`score`表。 2. INNER JOIN子句用于将`student_course`和`student`表与`score`表连接起来。通过`score.course_id = student_course.course_id`以及`student_course.student_id = student.id`这两个条件进行连接。 3. WHERE子句用于过滤查询结果。只有当`student.name`等于'小明'时,才会返回数据。 综上,这个SQL语句会返回所有名字为小明的学生的课程成绩。
优化sql:
SELECT course.name, course.teacher, score.score
FROM score
INNER JOIN course ON score.course_id = course.id
INNER JOIN student ON score.student_id = student.id
WHERE student.name = '小明'
这个SQL语句的目的是从三个表中(score, student_course, student)查询并返回满足特定条件的数据。具体步骤如下:
1. FROM子句指定了我们要查询的表,即`score`表。
2. INNER JOIN子句用于将`student_course`和`student`表与`score`表连接起来。
通过`score.course_id = student_course.course_id`以及`student_course.student_id = student.id`这两个条件进行连接。
3. WHERE子句用于过滤查询结果。只有当`student.name`等于'小明'时,才会返回数据。
综上,这个SQL语句会返回所有名字为小明的学生的课程成绩。这个SQL查询已经相当清晰,它从`score`表、
`student_course`表和`student`表获取数据。为了进一步优化这个查询,
你可以考虑以下几点:
1. 使用索引:在`student`表的`name`列上创建一个索引,以便更快地找到与'小明'匹配的记录。这将显著提高查询速度。
2. 预编译语句:如果你的应用程序需要频繁执行类似的查询(例如,查找不同学生的成绩),可以考虑使用预编译语句。这可以减少数据库服务器处理查询的时间。
3. 缓存:如果查询结果不经常变化,可以考虑将查询结果存储在缓存中(如Redis或Memcached),以减少对数据库服务器的请求。
4. 分区:如果表的数据量非常大,可以考虑对表进行分区,以提高查询性能。
5. 数据库优化器提示:在某些数据库系统中, 可以使用优化器提示来指导数据库如何执行查询。这些提示可以帮助你更精确地控制查询的执行计划。
6. 数据库连接池:如果你的应用程序需要连接到数据库执行多个查询,可以考虑使用数据库连接池来减少建立和关闭连接所需的时间。
7. 数据库硬件升级:最后但同样重要的是,确保你的数据库服务器有足够的硬件资源(如内存和处理器)来处理查询负载。这个SQL语句已经相当清晰,
它从三个表(course、score和student)中获取数据。为了进一步优化这个查询,你可以考虑以下几点:
1. 索引:为course表的id字段、score表的course_id字段和student表的id字段创建索引。这将有助于提高查询速度。
2. 分区:如果这三个表的数据量非常大,可以考虑对表进行分区。例如,可以根据course_id对score表进行范围分区,或者根据id对student表进行哈希分区。
3. 缓存:如果这个查询非常频繁,可以考虑使用缓存技术(如Redis或Memcached)来存储查询结果,以减少数据库的负担。
4. 连接顺序:在大多数数据库系统中,FROM子句中的表顺序会影响查询性能。因此,尝试调整表的顺序,看看是否有所改善。在这个例子中,
由于你已经在WHERE子句中对student表进行了过滤,所以连接顺序可能不会影响性能。
5. 优化器提示:如果你的数据库系统支持优化器提示,可以尝试使用这些提示来指导数据库执行更有效的查询计划。
6. 数据库参数调优:根据你的数据库系统和硬件配置,可能需要调整一些数据库参数以提高性能。例如,可以增加缓存大小、调整并发连接数等。
7. 定期维护:定期对数据库进行维护,如清理碎片、重建索引等,可以保持数据库的良好性能。
会告诉你分析结果,给出相关的建议
6.本次测试表结构
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for course
-- ----------------------------
DROP TABLE IF EXISTS `course`;
CREATE TABLE `course` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '科目ID',
`name` varchar(50) NOT NULL COMMENT '科目名称',
`teacher` varchar(50) NOT NULL COMMENT '授课教师',
`credit` int NOT NULL COMMENT '科目学分',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COMMENT='科目表';
-- ----------------------------
-- Records of course
-- ----------------------------
BEGIN;
INSERT INTO `course` VALUES (1, '语文', '张老师', 100);
INSERT INTO `course` VALUES (2, '数学', '王老师', 100);
COMMIT;
-- ----------------------------
-- Table structure for score
-- ----------------------------
DROP TABLE IF EXISTS `score`;
CREATE TABLE `score` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '成绩ID',
`student_id` int NOT NULL COMMENT '学生ID',
`course_id` int NOT NULL COMMENT '科目ID',
`score` int NOT NULL COMMENT '成绩',
PRIMARY KEY (`id`),
KEY `student_id` (`student_id`),
KEY `course_id` (`course_id`),
CONSTRAINT `score_ibfk_1` FOREIGN KEY (`student_id`) REFERENCES `student` (`id`),
CONSTRAINT `score_ibfk_2` FOREIGN KEY (`course_id`) REFERENCES `course` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COMMENT='学生成绩表';
-- ----------------------------
-- Records of score
-- ----------------------------
BEGIN;
INSERT INTO `score` VALUES (1, 1, 1, 90);
INSERT INTO `score` VALUES (2, 1, 2, 95);
INSERT INTO `score` VALUES (3, 2, 1, 100);
INSERT INTO `score` VALUES (4, 2, 2, 99);
COMMIT;
-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '学生ID',
`name` varchar(50) NOT NULL COMMENT '学生姓名',
`gender` varchar(10) NOT NULL COMMENT '学生性别',
`birthday` date NOT NULL COMMENT '学生生日',
`address` varchar(100) NOT NULL COMMENT '学生住址',
`phone` varchar(20) NOT NULL COMMENT '学生联系方式',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COMMENT='学生信息表';
-- ----------------------------
-- Records of student
-- ----------------------------
BEGIN;
INSERT INTO `student` VALUES (1, '小明', '男', '2023-06-16', '广州', '13724889158');
INSERT INTO `student` VALUES (2, '小羊', '女', '2023-06-16', '广州', '13800126000');
COMMIT;
-- ----------------------------
-- Table structure for student_course
-- ----------------------------
DROP TABLE IF EXISTS `student_course`;
CREATE TABLE `student_course` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '关系ID',
`student_id` int NOT NULL COMMENT '学生ID',
`course_id` int NOT NULL COMMENT '科目ID',
PRIMARY KEY (`id`),
KEY `student_id` (`student_id`),
KEY `course_id` (`course_id`),
CONSTRAINT `student_course_ibfk_1` FOREIGN KEY (`student_id`) REFERENCES `student` (`id`),
CONSTRAINT `student_course_ibfk_2` FOREIGN KEY (`course_id`) REFERENCES `course` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COMMENT='学生选修科目表';
-- ----------------------------
-- Records of student_course
-- ----------------------------
BEGIN;
INSERT INTO `student_course` VALUES (1, 1, 1);
INSERT INTO `student_course` VALUES (2, 1, 2);
INSERT INTO `student_course` VALUES (3, 2, 1);
INSERT INTO `student_course` VALUES (4, 2, 2);
COMMIT;
SET FOREIGN_KEY_CHECKS = 1;
图表的使用
1.新建图表
Chat Type是图表类型,支持线性图、饼状图和字段,这里的使用和控制台使用相似,也支持白话文转SQL,执行目标SQL点击确认即可展示。
由于今日AI次数使用完,展示系统数据图即可
总结
1.本次测试环境为jdk17,maven3.9.0,mysql8.0
2.简单来说就是一个数据库连接客户端,结合了AI功能,作者的想法很新奇
3.在选择相关表时一定要准确,用到那个表选那个表,不然生成的sql有问题,会报错。
4.mac的操作界面和Windows长得不一样好像,用法相同,感兴趣的同学可以出一期mac教程
5.还有网页端功能没有展示后续继续更新,有兴趣的同学可以探索一下。有不足和需要改正的地方欢迎大家指点。
最后说一句努力,加油学习,不断进步!!!