MySQL基础汇总

MySQL基础汇总

文章目录

思维导图

Mysql数据库的基础MySQL数据库分库分表的问题
MySQL的一些题目

索引

索引特点优缺点适用场合

索引特点优缺点

  • 优点:
    1. 加快检索速度–使用到B+树检索
    2. 唯一性
    3. 分组、排序可以显著减少时间,减少回表
  • 缺点
    1. 降低插入更新的速度
    2. 需要维护索引
    3. 需要空间

索引使用的注意事项

  1. 别用or
  2. 多列索引需要使用第一列
  3. like使用%开头,就不会走索引

什么情况适用索引

  1. 经常group、order
  2. 查询用
  3. 避免回表,如果只查其中某几个字段,可以建一个索引
  4. union属性

什么情况不适用索引

  1. 索引拿到之后,还需要回到原表中查数据
  2. 一些没有特征的值,比如性别。就2种

数据库的索引数据结构

二分查找树

B树

B+树

B树和B+树的区别

  1. B+树的非叶子节点不保存关键字记录的指针,这样使得B+树每个节点所能保存的关键字大大增加;
  2. B+树叶子节点保存了父节点的所有关键字和关键字记录的指针,每个叶子节点的关键字从小到大链接;
  3. B+树的根节点关键字数量和其子节点个数相等;
  4. B+的非叶子节点只进行数据索引,不会存实际的关键字记录的指针,所有数据地址必须要到叶子节点才能获取到,所以每次数据查询的次数都一样;

为什么使用B+树

  1. 有利于数据库扫描
B树在提高了磁盘IO性能的同时并没有解决元素遍历的效率低下的问题,
而B+树只需要遍历叶子节点就可以解决对全部关键字信息的扫描,
所以对于数据库中频繁使用的range query,B+树有着更高的性能。
  1. 磁盘读写代价低
B+树的内部结点并没有指向关键字具体信息的指针。因此其内部结点相对B树更小。
如果把所有同一内部结点的关键字存放在同一盘块中,那么盘块所能容纳的关键字数量也越多
一次性读入内存中的需要查找的关键字也就越多。相对来说I/O读写次数也就降低了。
  1. 查询效率稳定
由于内部结点并不是最终指向文件内容的结点,而只是叶子结点中关键字的索引。
所以任何关键字的查找必须走一条从根结点到叶子结点的路。
所有关键字查询的路径长度相同,导致每一个数据的查询效率相当。

索引分类

索引的分类

  1. 主键索引
  2. 全文索引:可以针对值中的某个单词
  3. 普通索引:允许重复
  4. unique唯一索引:不可以相同,可以为null
  5. 组合索引:将多个字段建到同一个索引里面,组合需唯一
  6. 聚集索引:指向的就是这一行的数据,相当于主键。(没设置主键的话,依次:第一个唯一键、隐藏主键)

引擎

innoDB

MyISAM

区别

  1. 实现上,I在叶子节点上存储数据地址,M在叶子节点上直接跟数据内容
  2. I适用于多并发,多写的模式上。M适用于读比较多
  3. M锁粒度到表,I锁粒度到行

事务隔离级别(恶果:脏读 幻读 不可重复读)

分类

  1. 读未提交
  2. 读提交
  3. 可重复读
  4. 串行化

数据库特性 ACID

  1. 原子性
  2. 一致性
  3. 隔离性
  4. 持久性

sql

sql优化

  1. 避免全表扫描,建立索引
  2. 避免全表扫描,不用in、or、not in
  3. 避免全表扫描,计算之后,不走索引

实践中的sql优化

  1. 数据结构要对
  2. 适当冗余
  3. explain sql语句,查看问题

5 种连接 left join、right join、inner join,full join cross join

  1. left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录
  2. right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录
  3. inner join(等值连接) 只返回两个表中联结字段相等的行

数据库设计

  1. 第一范式:列不可再分
  2. 第二范式:表只做一件事情
  3. 第三范式:避免值传递
  4. 第四范式:同一个表中的多对多关系去除
  5. 第五范式:从最终结构建立原始结构

数据库连接池

DDL DML DCL

  1. 表结构 创建表、字段等
  2. 表数据 curd
  3. DCL:数据控制。commit、rollback、set transaction

数据库锁

explain

char varchar text 区别

  1. char定长,255,用空格在字符串后面补齐
  2. varchar可变长度,65535
  3. text,全部用来存字符串

limit200怎么优化

select * from Member limit 10000,100

  1. 子查询优化
select * from Member where MemberID >= (select MemberID fro
m Member limit 100000,1) limit 100
  1. id限定
select * from orders_history where type=2 and id between 1000
000 and 1000100 limit 100;

分库分表

问题

  1. 为什么要分库分表
  2. 中间件
  3. 中间件对比
  4. 怎么拆分的
  5. 如何线上切换系统
  6. 动态扩容方案
  7. 全局id

分析

解决方案

为什么要分库分表

一般是并发量大或者数据量大

中间件

TDDL、mycat、sharding-jdbc

中间件对比

  1. TDDL:淘宝团队开发,client层,基本没人用
  2. mycat:基于阿里的cobar,功能完善,proxy层
  3. sharding,当当开源,client层方案,社区活跃

怎么拆分的

  1. 垂直拆分:订单表,订单商品表、订单日志表等。
  2. 水平拆分:表结构一样,分布到不同的库里面

如何线上切换系统

  1. 停机迁移
  2. 双写迁移
A表示需要分割的表
原来的代码对A表进行增删改的地方,都加上对新库的增删改代码
新库同时导老库的数据
同时根据"修改时间"字段判断是否写入
循环几次,基本能保证新老一致

分库分表不停机方案

动态扩容方案

  1. 32*32
  2. 添加机器,就把旧的数据往新机器放
  3. 直到32台机器

全局id

  1. 数据库自增id
  2. uuid
  3. 系统当前时间
  4. snowflake算法
1 + 41 + 10 + 12
不用+时间戳+工作机器id+同一毫秒内的数字

结合实际

  1. 数据量大了,影响效率,三个表千万的数据,占了4G左右
  2. 查询有时候需要几秒的时间,插入速度减慢
  3. 用的sharding
  4. 分为128份,估算一年是一亿左右的数据
  5. 停机扩容
  6. 时间戳+课程+随机数

读写分离

如何实现读写分离

主从架构,一个主库挂上一个或者多个从库,通过mysql的同步功能

主从复制的原理是什么

  1. binlog复制
  2. binlog:mysql中的所有增删改操作,都会记录到binlog日志里面(statement记录语句、row记录修改前后的数据、mixed混合模式-不会有歧义的就statement)
  3. 主库写入数据,同时也会写redolog和binlog,有一个io线程和从库连接
  4. 从库通过io线程拿到binlog,写到系统的文件缓存中relaylog,sql线程去执行relay日志,将这个同步到本地库中
  5. 从库的操作是串行化的
  6. 主库写并发1000会有几ms的延时,2000有小几十

数据丢失问题

  1. 问题描述:写完binlog,主库就挂掉了
  2. 通过semi-sync半同步复制
  3. 表示binlog需要被其他任意一个库读取到,才算这条语句执行完毕

主从同步延时的问题

  1. 因为主从同步延时产生的问题
  2. 开启从库的并行复制,就是sql线程
  3. 分库,分摊压力
  4. 部分强要求的实时性的,直接连主库
  5. 代码重写

题目

  1. MySQL的复制原理以及流程基本原理流程,3个线程以及之间的关联
  2. MySQL中myisam与innodb的区别,至少5点
  3. MySQL中varchar与char的区别以及varchar(50)中的50代表的涵义
    (1). varchar与char的区别 (2). varchar(50)中50的涵义 (3). int(20)中20的涵义 (4). mysql为什么这么设计
    事务
  4. 问了innodb的事务与日志的实现方式
    (1). 有多少种日志;
    (2). 事物的4种隔离级别 (3).事务是如何通过日志来实现的,说得越深入越好。
  5. 问了MySQL binlog的几种日志录入格式以及区别
    1). binlog的日志格式的种类和分别 (2). 适用场景; 结合第一个问题,每一种日志格式在复制中的优劣。
  6. 问了下MySQL数据库cpu飙升到500%的话他怎么处理?
    1. 查看日志
    2. 查看当前进程
    3. 没有经验的,可以不问; (2). 有经验的,问他们的处理思路。
  7. sql优化 (1). explain出来的各种item的意义; (2). profile的意义以及使用场景;
    1. 语句类型
    2. 索引
    3. 行数
  8. 备份计划,mysqldump以及xtranbackup的实现原理
    (1). 备份计划;
    (2). 备份恢复时间;
    (3). xtrabackup实现原理
  9. mysqldump中备份出来的sql,如果我想sql文件中,一行只有一个insert…value()的话,怎么办?如果备份需要带上master的复制点信息怎么办?
  10. 500台db,在最快时间之内重启
  11. innodb的读写参数优化 (1). 读取参数 (2). 写入参数; (3). 与IO相关的参数; (4). 缓存参数以及缓存的适用场景。
  12. 你是如何监控你们的数据库的?你们的慢日志都是怎么查询的?
    阿里的during,有提供看板
  13. 你是否做过主从一致性校验,如果有,怎么做的,如果没有,你打算怎么做?
  14. 你们数据库是否支持emoji表情,如果不支持,如何操作?
    utf8-mb4
  15. 你是如何维护数据库的数据字典的?
    1. 注释
    2. 字典表
  16. 你们是否有开发规范,如果有,如何执行的
  17. 表中有大字段X(例如:text类型),且字段X不会经常更新,以读为为主,请问 (1). 您是选择拆成子表,还是继续放一起; (2). 写出您这样选择的理由。
    join会有性能消耗
    不拆
  18. MySQL中InnoDB引擎的行锁是通过加在什么上完成(或称实现)的?为什么是这样子的?
    for update,根据主键、唯一键
  19. 如何从mysqldump产生的全库备份中只恢复某一个库. 某一张表?
    开放性问题:据说是腾讯的 一个6亿的表a,一个3亿的表b,通过外间tid关联,你如何最快的查询出满足条件的第50000到第50200中的这200条数据记录。
  20. SQL语言包括哪几部分?每部分都有哪些操作关键字?
  21. 完整性约束包括哪些?
  22. 什么是事务?及其特性?
  23. 什么是锁?
  24. 什么叫视图?游标是什么?
  25. 什么是存储过程?用什么来调用?
  26. 索引的作用?和它的优点缺点是什么?
  27. 如何通俗地理解三个范式?
  28. 什么是基本表?什么是视图?
  29. 试述视图的优点?
  30. NULL是什么意思
  31. 主键、外键和索引的区别?
  32. 你可以用什么来确保表格里的字段只接受特定范围里的值?
  33. 说说对SQL语句优化有哪些方法?(选择几条)
  34. SQL语句中‘相关子查询’与‘非相关子查询’有什么区别?
  35. char和varchar的区别?
  36. Mysql 的存储引擎,myisam和innodb的区别。
  37. 数据表类型有哪些
  38. MySQL数据库作发布系统的存储,一天五万条以上的增量,预计运维三年,怎么优化?
  39. 对于大流量的网站,您采用什么样的方法来解决各页面访问量统计问题?
  40. 如何进行SQL优化?(关于后边的解释同学们可以进行理解,到时根据自己的理解把大体意思说出来即可)
  41. 为表中得字段选择合适得数据类型(物理设计)
  42. 存储时期

解决

MySQL的复制原理以及流程基本原理流程,3个线程以及之间的关联

MySQL中myisam与innodb的区别,至少5点

MySQL中varchar与char的区别以及varchar(50)中的50代表的涵义

(1). varchar与char的区别 (2). varchar(50)中50的涵义 (3). int(20)中20的涵义 (4). mysql为什么这么设计
事务

问了innodb的事务与日志的实现方式

(1). 有多少种日志;  
(2). 事物的4种隔离级别  (3).事务是如何通过日志来实现的,说得越深入越好。

问了MySQL binlog的几种日志录入格式以及区别

1). binlog的日志格式的种类和分别 (2). 适用场景; 结合第一个问题,每一种日志格式在复制中的优劣。

问了下MySQL数据库cpu飙升到500%的话他怎么处理?

1. 查看日志
2. 查看当前进程
3. 没有经验的,可以不问;  (2). 有经验的,问他们的处理思路。

sql优化 (1). explain出来的各种item的意义; (2). profile的意义以及使用场景;

1. 语句类型
2. 索引
3. 行数

备份计划,mysqldump以及xtranbackup的实现原理

(1). 备份计划;  
(2). 备份恢复时间;  
(3). xtrabackup实现原理

mysqldump中备份出来的sql,如果我想sql文件中,一行只有一个insert…value()的话,怎么办?如果备份需要带上master的复制点信息怎么办?

500台db,在最快时间之内重启

innodb的读写参数优化 (1). 读取参数 (2). 写入参数; (3). 与IO相关的参数; (4). 缓存参数以及缓存的适用场景。

你是如何监控你们的数据库的?你们的慢日志都是怎么查询的?

阿里的during,有提供看板

你是否做过主从一致性校验,如果有,怎么做的,如果没有,你打算怎么做?

你们数据库是否支持emoji表情,如果不支持,如何操作?

utf8-mb4

你是如何维护数据库的数据字典的?

1. 注释
2. 字典表

你们是否有开发规范,如果有,如何执行的

表中有大字段X(例如:text类型),且字段X不会经常更新,以读为为主,请问 (1). 您是选择拆成子表,还是继续放一起; (2). 写出您这样选择的理由。

join会有性能消耗
不拆

MySQL中InnoDB引擎的行锁是通过加在什么上完成(或称实现)的?为什么是这样子的?

for update,根据主键、唯一键

如何从mysqldump产生的全库备份中只恢复某一个库. 某一张表?

开放性问题:据说是腾讯的 一个6亿的表a,一个3亿的表b,通过外间tid关联,你如何最快的查询出满足条件的第50000到第50200中的这200条数据记录。
2. SQL语言包括哪几部分?每部分都有哪些操作关键字?
3. 完整性约束包括哪些?
4. 什么是事务?及其特性?
5. 什么是锁?
6. 什么叫视图?游标是什么?
7. 什么是存储过程?用什么来调用?
8. 索引的作用?和它的优点缺点是什么?
9. 如何通俗地理解三个范式?
10. 什么是基本表?什么是视图?
11. 试述视图的优点?
12. NULL是什么意思
13. 主键、外键和索引的区别?
14. 你可以用什么来确保表格里的字段只接受特定范围里的值?
15. 说说对SQL语句优化有哪些方法?(选择几条)
16. SQL语句中‘相关子查询’与‘非相关子查询’有什么区别?
17. char和varchar的区别?
18. Mysql 的存储引擎,myisam和innodb的区别。
19. 数据表类型有哪些
20. MySQL数据库作发布系统的存储,一天五万条以上的增量,预计运维三年,怎么优化?
21. 对于大流量的网站,您采用什么样的方法来解决各页面访问量统计问题?
22. 如何进行SQL优化?(关于后边的解释同学们可以进行理解,到时根据自己的理解把大体意思说出来即可)
23,为表中得字段选择合适得数据类型(物理设计)
24:存储时期

发布了214 篇原创文章 · 获赞 166 · 访问量 227万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 像素格子 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览