赞
踩
MySQL 默认的编码是 utf8,仅支持三个字节的存储;utf8mb4 支持四个字节的存储。
SHOW DATABASES;
SELECT DATABASE();
CREATE DATABASE [IF NOT EXISTS] 数据库名 (DEFAULT CHARSET 字符集) [COLLATE 排序规则];
DROP DATABASE [IF EXISTS] 数据库名;
USE 数据库名;
SHOW TABLES;
DESC 表名;
SHOW CREATE TABLE 表名;
CREATE TABLE 表名 ( 字段1 字段1类型 [COMMENT 字段1注释], 字段2 字段2类型 [COMMENT 字段2注释], 字段3 字段3类型 [COMMENT 字段3注释], 字段n 字段n类型 [COMMENT 字段n注释] ) [COMMENT 表注释];
ALTER TABLE 表名 ADD 字段名 类型(长度) [COMMENT 注释] [约束];
ALTER TABLE 表名 MODIFY 字段名 新数据类型(长度);
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 类型(长度) [COMMENT 注释] [约束];
ALTER TABLE 表名 DROP 字段名;
DROP TABLE [IF EXISTS] 表名;
TRUNCATE TABLE 表名;
MySQL 聚合函数将一列数据作为一个整体进行纵向计算
count
max
min
avg
sum
SELECT 聚合函数(字段列表) FROM 表名;
使用聚合函数时,所有的 null 值不参与运算。例如,select count(*) from emp;
可以查询到所有的数量,而select count(idcard) from emp;
若 idcard 中有 null 值则会缺少,因为 null 不参与计算。
语法:SELECT 字段列表 FROM 表名 [WHERE 条件] GROUP BY 分组字段名 [HAVING 分组后过滤条件];
语法:SELECT 字段列表 FROM 表名 ORDER BY 字段1 排序方式1, 字段2 排序方式2;
如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序。
函数是一段可以直接被另一段程序调用的程序或代码。
约束作用于表中字段上的规则,用于限制存储在表中的数据,目的是保证数据库中数据的正确、有效性和完整性。
NOT NULL
。UNIQUE
。PRIMARY KEY
。DEFAULT
。CHECK
。FOREIGN KEY
。- create table user(
- id int primary key auto_increment comment'主键',
- name varchar(10) not null unique comment'姓名',
- age int check(age > 0 && age <= 120) comment'年龄',
- status char(1) default '1' comment'状态',
- gender char(1) comment'性别'
- ) comment'用户表';
外键用来让两张表的数据之间建立连接,从而保证数据的一致性和完整性。
ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;
索引是帮助 MySQL 高效获取数据的数据结构。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引向(指向)数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。
以一颗最大度数(max - degree)为 5(5 阶)的 b - tree 为例(每个节点最多存储 4 个 key,5 个指针):
- 数据:10, 15, 18, 20, 23, 25, 28, 30, 34, 56, 58, 62, 64, 78, 88, 89, 92, 96, 98
- 指针:3, 4, 14, 16, 17, 19
树的度数指的是一个节点的子节点个数。
以一颗最大度数(max - degree)为 4(4 阶)的 b + tree 为例:
- 数据:38, 55, 58, 67, 90, 94
- 指针:6, 12, 16, 18, 29, 34, 38, 45, 55, 56, 58, 62, 87, 90, 92, 94, 98
哈希索引是采用一定的 hash 算法,将键值换算成新的 hash 值,映射到对应的槽位上,然后存储在 hash 表中。
如果两个(或多个)键值,映射到同一个槽位上,它们就产生了 hash 冲突(hash 碰撞),可以通过链表来解决。
答:相对于二叉树,层级更少,搜索效率高;对于 B - tree,无论是叶子节点还是非叶子节点,都会保存数据,这样导致一页中存储的键值减少,指针跟着减少,要同样保存大量数据,只能增加树的高度,导致性能降低;相较 Hash 索引,B + tree 支持范围匹配及排序操作。
以下 SQL 语句,哪个执行效率高?为什么?
- select * from user where id = 10;
- select * from user where name = 'Arm';
id 为主键,name 字段创建的有索引。
答:select * from user where id = 10;
更快。
- select * from user where id = 10;`这个语句中根据 id = 10 可以有以下步骤:
- 直接找到 id = 10 的整行数据。
-
- `select * from user where name = 'Arm';`这个语句根据 name = 'Arm' 有以下步骤:
- 先找到 Arm 的 id,然后再根据 id 找到整行数据,涉及到回表,因此效率不高。
CREATE [UNIQUE | FULLTEXT ] INDEX index_name ON table_name (index_col_name,...);
SHOW INDEX FROM table_name ;
DROP INDEX index_name ON table_name;
CREATE INDEX idx_user_name ON tb_user(name);
CREATE UNIQUE INDEX idx_user_phone ON tb_user(phone);
CREATE INDEX idx_user_pro_age_sta ON tb_user(profession, age, status);
CREATE INDEX idx_email ON tb_user(email);
show [session|global] status like 'Com_______';
(注:该命令可查询执行频次,一个下划线代表一个字符)show variables like ’slow_query_log'
#开启 MySQL 慢日志查询开关
slow_query_log = 1
设置慢日志的时间为 2 秒,SQL 语句执行时间超过 2 秒,就会视为慢查询,记录慢查询日志
long_query_time = 2
systemctl restart mysqld
cd /var/lib/mysql
localhost - slow.log
SELECT @@have_profiling;
#查看该数据库是否支持SET profiling = 1;
#profiling 默认是关闭的,可以开启,可以通过 session/global 设置开启级别show profiles;
#查看 SQL 语句的执行情况show profile for query ${id};
#查看指定 query_id 的 SQL 语句各个阶段的耗时情况
以上是根据 B 站黑马课程学习后的 MySQL 笔记,为了日后复习和给别人参考而整理,希望对大家有所帮助。同时,在实际应用中,还需要根据具体情况合理使用索引、约束等功能,以提高数据库的性能和数据的完整性。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。