首页 体育 教育 财经 社会 娱乐 军事 国内 科技 互联网 房产 国际 女人 汽车 游戏

MySQL 数据库的基本使用示例

2019-12-18

对一般的开发者来说,MySQL 装置成功今后,剩余的便是根本的运用了,假如是运维开发,或许还会涉及到数据库的运维。本文暂时不考虑运维上的操作,仅就数据库的运用给出一些示例,首要包括 CURD 、 JOIN 和 EXPLAIN 。

入门——初级—— 中级√ ——高档;本文习惯中级及以上。

现在常见的操作体系有三类:Linux、Windows、Mac。不同渠道装置软件的方法各异,装置进程中或许遇到的问题也各不相同,咱们可以依据自己所运用的渠道进行探究。由于自己运用的是 Mac,因而只给出 Mac 操作体系上 MySQL 的装置与发动。

简略总结下来便是下面几个指令

# 装置 homebrew, 参阅 https://brew.sh/
/usr/bin/ruby -e $ 
# 查找可以装置的 mysql 计划
brew search mysql
# 装置 5.7 版别的 mysql
brew install mysql@5.7
# 检查 mysql@5.7 的装置信息、发动信息等
brew info mysql@5.7
# 开机发动 mysql@5.7
brew services start mysql@5.7

发动 MySQL 后,咱们可以经过 ps -ef |grep mysql 来检查与 MySQL 相关的进程,可以发现 后台会运转一个 mysqld 的进程,也便是说咱们一般所说的 “衔接数据库” 其实指的是衔接 mysqld 供给的数据库服务。

一般本地装置完 MySQL 后,会默许装置 mysql 这个指令,可以用它来衔接 mysqld 供给的服务。

# 衔接本地 localhost 端口为 3306 的数据库 hello
# 运用 root 用户,且要求输入暗码
mysql -h localhost -P 3306 -D hello -u root -p
# 咱们可以疏忽 -h 和 -P 来简化上面的句子
# 下面的句子表明: 以 root 用户衔接本地 3306 端口上的数据库 hello
mysql -D hello -u root -p
# 假如不需求指定衔接哪个数据库,还可以省掉 -D 及其参数
mysql -u root -p
# 假如需求指定字符集为 utf8mb4,需求增加
mysql -u root -p --default-character-set=utf8mb4

衔接到数据库今后,咱们可以经过下面的句子创立一个数据库。

-- SQL 的注释运用的是 双横线 “--”
-- 假如 hello 数据库现已存在,就显式地先删去这个数据库
-- 然后创立一个名为 hello 的数据库,并指定其默许的字符集为 utf8mb4
-- 咱们可以自行查找 MySQL utf8mb4 相关的内容
DROP DATABASE IF EXISTS hello;
CREATE DATABASE `hello` DEFAULT CHARACTER SET = `utf8mb4`;
-- 有了数据库今后就可以运用这个数据库了,然后才可以在数据库中创立表
USE hello;

接下来咱们仿照一个博客体系创立几个数据表,别离包括用户表 users、博客表 blogs 和谈论表 comments。

在创立表的时分咱们有几个默许项,数据库引擎运用 InnoDB ,字符集运用 utf8mb4 。由于 InnodB 的 “聚簇索引” 和“二级索引包括引证行的主键列”的特性,默许情况下咱们会创立一个类型为 int 的主键 id 。

下面的句子创立了用户 users 表。

-- 为了实验环境的洁净整齐,首要检查是否现已存在 users 表
-- 假如现已存在 users 表就先删去掉,接着创立 users 表
-- 用户表中包括的字段及其意义可以检查 COMMENT 中补白的内容
DROP TABLE if EXISTS users;
CREATE TABLE `users`  NOT NULL AUTO_INCREMENT COMMENT '主键,用户 id',
 `created_at` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创立时刻',
 `updated_at` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时刻',
 `username` varchar DEFAULT NULL COMMENT '用户名',
 `birthday` datetime DEFAULT NULL COMMENT '生日日期',
 PRIMARY KEY ,
 KEY `idx_user_created_at`  USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4;

下面的句子创立了博客 blogs 表。

-- 为了实验环境的洁净整齐,首要检查是否现已存在 blogs 表
-- 假如现已存在 blogs 表就先删去掉,接着创立 blogs 表
-- 用户表中包括的字段及其意义可以检查 COMMENT 中补白的内容
DROP TABLE if EXISTS blogs;
CREATE TABLE `blogs`  NOT NULL AUTO_INCREMENT COMMENT '主键,博客 id',
 `created_at` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创立时刻',
 `updated_at` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时刻',
 `user_id` int DEFAULT NULL COMMENT '用户id',
 `title` varchar DEFAULT NULL COMMENT '博客标题,最多 50 个字符',
 `content` text DEFAULT NULL COMMENT '博客内容',
 PRIMARY KEY ,
 KEY `idx_blogs_created_at`  USING BTREE,
 KEY `idx_blogs_user_id`  USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4;

下面的句子创立了谈论 comments 表。

-- 为了实验环境的洁净整齐,首要检查是否现已存在 comments 表
-- 假如现已存在 comments 表就先删去掉,接着创立 comments 表
-- 用户表中包括的字段及其意义可以检查 COMMENT 中补白的内容
DROP TABLE if EXISTS comments;
CREATE TABLE `comments`  NOT NULL AUTO_INCREMENT COMMENT '主键,谈论 id',
 `created_at` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创立时刻',
 `updated_at` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时刻',
 `user_id` int DEFAULT NULL COMMENT '用户 id',
 `blog_id` int DEFAULT NULL COMMENT '博客 id',
 `content` varchar DEFAULT NULL COMMENT '谈论内容,约束最多 2048 个字符',
 PRIMARY KEY ,
 KEY `idx_blogs_created_at`  USING BTREE,
 KEY `idx_blogs_user_id`  USING BTREE,
 KEY `idx_blogs_blog_id`  USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4;
-- 首要下面手动给每个表插入了一条记载
INSERT INTO `users`  VALUES ;
INSERT INTO `blogs`  VALUES ;
INSERT INTO `blogs`  VALUES ;
INSERT INTO `comments`  VALUES ;
INSERT INTO `comments`  VALUES ;
-- 为了阐明问题,下面界说了一个创立多个虚拟用户的进程
DELIMITER ;;
DROP PROCEDURE if EXISTS mock_users;
CREATE PROCEDURE mock_users
BEGIN
 DECLARE i INT;
 SET i = 1;
 WHILE i 1000 DO
 INSERT INTO `users`  VALUES , NULL);
 INSERT INTO `blogs`  VALUES ;
 INSERT INTO `comments`  VALUES ;
 SET i = i + 1;
 END WHILE;
END ;;
DELIMITER ;
-- 调用 mock_users 生成多个用户账户,以及对应的 blogs 和 comments
CALL mock_users

咱们可以经过 JOIN 的方法来获取某个用户宣布的博客的一切内容,以及其博客所取得的谈论内容。

SELECT u.id as user_id,
 u.username,
 b.id as blog_id,
 b.title as blog_title,
 b.content as blog_content,
 c.id as comment_id,
 c.user_id as comment_user_id,
 c.content as comment_content,
 cu.username as comment_username
FROM users as u
LEFT JOIN blogs as b ON b.user_id=u.id
LEFT JOIN comments as c ON c.blog_id=b.id
LEFT JOIN users as cu ON cu.id=c.user_id
WHERE u.username='ws_by_hand_1';

获取到的成果如下图所示:

由于咱们的表的内容比较少,因而运转上面 JOIN 的内容不会有慢的感觉,可是咱们仍然可以运用 EXPLAIN 进行一番探究。

EXPLAIN
SELECT u.id as user_id,
 u.username,
 b.id as blog_id,
 b.title as blog_title,
 b.content as blog_content,
 c.id as comment_id,
 c.user_id as comment_user_id,
 c.content as comment_content,
 cu.username as comment_username
FROM users as u
LEFT JOIN blogs as b ON b.user_id=u.id
LEFT JOIN comments as c ON c.blog_id=b.id
LEFT JOIN users as cu ON cu.id=c.user_id
WHERE u.username='ws_by_hand_1';

上面的 EXPALIN 代码运转后得到的成果如下图所示。咱们可以经过检查 type 一列探究索引的运用情况,发现 users as u 表扫了全量表,当咱们的 user 表非常大的情况下,这儿肯定会存在问题。其实在创立 users 表的时分我故意少创立了一个索引,理论上应该在 users.username 这个字段上增加索引。

可以经过下面的句子为 users.username 字段增加索引:

ALTER TABLE `users` ADD INDEX `idx_user_username` ;

在增加完索引今后,在此 EXPLAIN 咱们的 JOIN 句子,可以得到下图的成果。可以发现 users as u 的 type 现已变成了字段 username 上的索引 ref 。

本文就数据库的运用给出一些示例,经过实例代码的方法给出 CURD 、 JOIN 和 EXPLAIN 的运用方法,在实践出产进程中可以为咱们供给一些参阅。 关于 ORM 东西的运用,在检索的进程中实质是 SQL 句子的组装、检索成果的解析,在数据库层面了解 SQL 无疑可以增强咱们对 ORM 的运用的了解,然后写出愈加高效牢靠的代码。

热门文章

随机推荐

推荐文章