
获得徽章 0
- MySQL打卡第十四天
## Explain 执行计划
1. id:id的值越大,代表优先级越高,越先执行。
2. select_type:表示 select 查询的类型,主要是用于区分各种复杂的查询,例如:普通查询、联合查询、子查询等。
3. table:查询的表名并不一定是真实存在的表,有别名显示别名,也可能为临时表。
4. partitions:查询时匹配到的分区信息。
5. type:查询使用了何种类型,它在 SQL优化中是一个非常重要的指标,以下性能从好到坏依次是:system > const > eq_ref > ref > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL。
6. possible_keys:表示在MySQL中通过哪些索引,能让我们在表中找到想要的记录,这个索引并不定一会是最终查询数据时所被用到的索引。
7. key:区别于possible_keys,key是查询中实际使用到的索引.
8. key_len:表示查询用到的索引长度(字节数),原则上长度越短越好。
9. ref:常见的有:const,func,null,关联字段。
10. rows:以表的统计信息和索引使用情况,估算要找到我们所需的记录,需要读取的行数。
11. filtered 这个是一个百分比的值,表里符合条件的记录数的百分比
12. Extra :不适合在其他列中显示的信息,Explain 中的很多额外的信息会在 Extra 字段显示。展开评论2 - MySQL打卡第十二天## 大表优化
1. 限制查询范围:务必禁止不带任何限制数据范围条件的查询语句。比如:我们当用户在查询订单历史的时候,我们可以控制在一个月的范围内;
2. 读写分离:经典的数据库拆分方案,主库负责写,从库负责读;
3. 垂直分区:根据数据库里表的相关特性进行拆分,简单来说垂直拆分是指数据表列的拆分,把一张列比较多的表拆分为多张表。
4. 水平分区:保持数据表结构不变,通过某种策略存储数据分片。这样每一片数据分散到不同的表或者库中,达到了分布式的目的。 水平拆分可以支撑非常大的数据量。
5. 数据库分片的常见方案:
- 客户端代理;
- 中间件代理;
6. 什么是数据库连接池?
7. 分库分表之后主键id如何处里,我们需要一个全局唯一的 id 来支持:
- UUID;
- 数据库自增 id ;
- 利用 redis 生成 id ;
- Twitter的snowflake算法 ;
- 美团的Leaf分布式ID生成系统 ;展开评论1 - MySQL打卡第十一天## 锁机制与InnoDB锁算法
1. MyISAM和InnoDB存储引擎使用的锁:
- MyISAM采用表级锁(table-level locking)。
- InnoDB支持行级锁(row-level locking)和表级锁,默认为行级锁
2. 表级锁行级锁对比:
- 表级锁: MySQL中锁定 粒度最大 的一种锁,对当前操作的整张表加锁,实现简单,资源消耗也比较少,加锁快,不会出现死锁。其锁定粒度最大,触发锁冲突的概率最高,并发度最低,MyISAM和 InnoDB引擎都支持表级锁。
- 行级锁:MySQL中锁定 粒度最小 的一种锁,只针对当前操作的行进行加锁。 行级锁能大大减少数据库操作的冲突。其加锁粒度最小,并发度高,但加锁的开销也最大,加锁慢,会出现死锁。
3. InnoDB存储引擎的锁的算法有三种
- Record lock:单个行记录上的锁
- Gap lock:间隙锁,锁定一个范围,不包括记录本身
- Next-key lock:record+gap 锁定一个范围,包含记录本身
4. innodb对于行的查询使用next-key lock
5. Next-locking keying为了解决Phantom Problem幻读问题
6. 当查询的索引含有唯一属性时,将next-key lock降级为record key
7. Gap锁设计的目的是为了阻止多个事务将记录插入到同一范围内,而这会导致幻读问题的产生
8. 有两种方式显式关闭gap锁:(除了外键约束和唯一性检查外,其余情况仅使用record lock) A. 将事务隔离级别设置为RC B. 将参数innodb_locks_unsafe_for_binlog设置为1展开12 - ## MySQL打卡第五天
1. 复习了增删改的一些指令
- get了新指令 `INSERT IGNORE`:忽略报错
- get了新指令 `INSERT ON DUPLICATE KEY UPDATE` :解决 `UNIQUE` 约束 或者主键约束
- 我可以使用 `LIMIT`子句来限制想要删除掉的记录数量,使用`ORDER BY`子句来指定符合条件的记录的删除
2. 弄懂了视图的概念
3. 自定义变量
```sql
# 定义并赋值自定义变量
SET @a = '哈哈';
SET @b = @a;
SET @c = (SELECT m1 FROM t1 LIMIT 1);
#另外一种赋值方式
SELECT n1 FROM t1 LIMIT 1 INTO @a;
SELECT m1, n1 FROM t1 LIMIT 1 INTO @a, @b;
```
4. delimiter 修改语句结束分隔符,用完要改回`;`
5. 认识了存储函数和存储过程。展开评论3 - MySQL打卡第三天
1. 数据库的基本操作:
- SHOW DATABASES;
- CREATE DATABASE 数据库名;
- USE 数据库名称;
- DROP DATABASE 数据库名;
-删除/创建数据库/表,如果数据库/表不存在/已存在,就是报 error级别的错误,后面的代码无法继续执行了。可以加上 IF EXISTS / IF NOT EXISTS,吧 error降到 warning,不会影响后续代码的执行
2. 表的操作
3. 列的属性 : 默认值 、NOT NULL、 主键、UNIQUE、外键 、 AUTO_INCREMENT、COMMENT、ZEROFILL展开评论2 - MySQL打卡第二天
学习了Mysql的数据类型:
1. 整数类型:TINYINT(1)、SMALLINT(2)、MEDIUMINT(3)、INT(4)、BIGINT(8)。一个字节占8位,以 INT 为例,他的无符号数取值范围为 0 ~ 2²⁴-1,有符号数的取值范围为 -2²³ ~ 2²³-1(符号要占一位)。
2. 浮点数类型:FLOAT(4)、DOUBLE(8)。
- 计算机的浮点数表示有时是不精确的。
- FLOAT(M, D) 、DOUBLE(M, D),可以这样设置浮点数。M 表示该小数最多需要的十进制有效数字个数(2.3有效个数为2),`D`表示该小数的小数点后的十进制数字个数。
3. 定点数类型:DECIMAL(M, D),可以保证小数是精确的。了解了 DECIMAL 的存储方式,从小数点位置出发,每个整数每隔9个十进制位划分为1组。
4. 日期和时间类型:YEAR(1)、DATE(3)、TIME(3)、DATETIME(8)、TIMESTAMP(4)。
5. 字符串类型:CHAR、VARCHAR、TINYTEXT、TEXT、MEDIUMTEXT、MEDIUMTEXT。
- VARCHAR 解决了 CHAR 存储长短不一的字符串时浪费空间的问题。
6. ENUM 类型和SET 类型。
7. 二进制类型。展开31 - MySQL打卡第一天
1. MySQL 的优势:免费、开源、跨平台、性能强。
2. Window 下 MySQL的安装、环境配置、启动运行。
3. 命令行连接使用 Mysql,了解了Mysql 语句使用的注意事项。
Mysql 语句使用的注意事项:
- 命令要以 ; \g \G 其中之一结尾;
- 命令可以随意换行;
- 可以一次提交多个命令;
- 使用\c放弃本次操作;
- MySQL默认对命令的大小写并没有限制,但是按照规范,命令、函数什么的都是要大写的,而一些名称类的东西,比如数据库名,表名、列名啥的都是要小写的;
- 要使用单引号''或者双引号""把字符串内容引起来。展开11