「Python 面试」第五次更新

2023-11-20

1.说一下 char、varchar 、text 的区别

这里先介绍一下数据库的概念,数据库是一种数据结构,内含多种算法,帮助我们将数据以最优化的方式存储在计算机中,也可以帮助我们快速找到存储的数据。

数据最终存储在计算机中都是以「二进制」的方式存储。比如 4,存储在计算机中其实是以 0100 的方式存储。比如 A,存储在计算中是以 0100 0001 的方式存储。

char:定长字符型,最大可存储 255 (2 的 8 次方)个字节长度,可以理解成最大可以存储 255 个字符。在计算机中以 8 位二进制的方式存储。

使用char类型存储数据时,假设存储的数据是 4,4 在计算机中存储的结果是 0000 0100,意味着使用定长字符型char,不管你存储的值是多少位,最终在计算机里都是以 8 位二进制的方式存储,不满 8 位,前面补 0。超过 8 位,超出的部分会被去除。

也就是说当使用char字符型存储数据后,该数据转换为二进制时的长度超过了 8 位,那么该数据将不会完整存储,会「丢失」一部分数据。

varchar:不定长字符型,最大可存储 65535(2 的 16 次方) 个字节长度,在计算机中以 16位 二进制的方式存储。

它与char不同的地方在于,当字符长度在 0-255 以内时,会在后面添加一个字节,超过 255 时,添加两个字节。同样的,当超过最大存储长度后,也会丢失一部分数据。

text:长文本数据类型,最大可存储 65555 个字节长度,不能指定长度,也就是说不支持text(num)

但是该类型尽量不要使用,因为text类型数据在检索中,不会使用索引,而是使用全局搜索,这会产生临时表,使得检索时间变长,不推荐使用。

由于charvarchar的特性,在实际使用当中,如果该数据是经常会发生变化、经常使用的,那么推荐使用char类型,因为 MySQL 在对数据进行排序时,会根据该数据的长度来排,固定长度的char类型会提供更高的性能。但是由于固定长度的特性,在存储短数据时,一定程度上也会造成资源浪费,算是一个双刃剑。

2. varchar(100)中的 100 有什么意义

100 只是在呈现角度上定义的,比如该数据有 120 个字符,那么你在查询该数据时,看到的只有 100 个。但是如果在定义时,添加了UNSIGNED ZEROFILL属性,那么这将改变该类型的最大存储长度。

同样的,在实际使用当中,varchar(num)里的值不需要定义的特别长,只要够用就行,具体原因上面有提,这里不再赘述。

3. 说一说 DROP、DELETE、TRUNCATE 的区别

DORP:非事务操作,彻底删除一张表,无法反悔恢复。

DELETE:事务操作,删除表里的一行或多行数据,如果反悔或是误删,可以通过「事务回滚」恢复该表。不会影响该表下的view或索引。

TRUNCATE:非事务操作,删除表里的某行数据,或是删除整张表的数据(表依然存在,只是成了一张空表)。无法反悔恢复,并且会将该表下的view或索引重置。

执行速度:DROP > TRUNCATE > DELETE。

4. 说一说 MySQL 三范式

**第一范式:**表中的字段只能表达一种意思,不能模棱两可。

**第二范式:**表必须含有一个唯一主键来标识这张表。

**第三范式:**表中的字段不能互相依赖。

5. 说一说 MySQL 中如何分区、分表

Scale Out(垂直切分)

Scale Up(横向拆分)

这里有篇文章值得看一看。MySQL 分区、分表

6. 了解索引吗

如果把数据库当做一本书的话, 那么索引就是书的「目录页」,通过目录,我们可以快速定位查找内容,同样的,目录页在书中也占了一页纸,所以索引是一个数据结构,也要占据数据库物理内存。

索引分为 4 种类型:普通索引、唯一索引、主键索引和全文索引(MyISAM 专有)。

索引的创建规则:经常使用的字段名,和出现在 where 后面的字段名,建议为它们创建索引,索引要遵循最左前缀原则(最能体现该索引特征,也就是常用的字段放最左边)。

索引的原理:可以看看这篇文章。索引

索引的使用场景:中等、大量数据时,使用索引效率会非常高,小型数据不建议使用索引,没有全局搜索来的快。

索引的作用:索引可以提高查询速度。但是索引会增加数据库存储额外开销。索引会将数据库查询时的随机 I/O 变成顺序 I/O,减少服务器排序操作,和临时表的开销。

7. 说一下常用的 MySQL 优化手段

  • 使用EXPLAIN查看 SQL 执行计划,帮助自己查看哪些地方可以优化。
  • 杜绝使用 SELECT * FROM xxx 这种查询语句,需要什么就查什么。
  • 尽量不要使用text这种类型,这会使得数据查询该字段时,创建临时表。
  • 明确知道查询数据结果大概有几行时,使用LIMIT,为查询结果限制显示页数。
  • 避免使用 MySQL 的内置函数。
  • 尽量使用 EXISTSBETWEEN代替IN
  • 避免在 WHERE中使用表达式操作,这会使得 MySQL 放弃使用索引查询。
  • 尽量使用小表驱动大表(从小的表中,查找跟大表中有关系的数据),可以减少 CPU 运算次数,以及 I/O 总量。
  • 尽量使用INNER JOIN而不是LEFT JOIN,因为前者默认使用小表驱动大表。
  • 索引要遵循最左前缀法则。
  • 避免使用模糊查询LIKE
  • 避免设置字段NULL属性,在对NULL进行判断时,会使得 MySQL 放弃使用索引。

8. InnoDB 和 MyISAM 的区别

  • InnoDB 支持外键,MyISAM 不支持。
  • MyISAM 拥有全文索引,InnoDB 没有。
  • 数据库崩溃后,InnoDB 可以安全恢复,而 MyISAM 不可以。
  • InnoDB 拥有事务,而 MyISAM 没有。
  • InnoDB 拥有行锁,而 MyISAM 拥有表锁。
  • MyISAM 计算 COUNT(*)时,速度远高于 InnoDB。

9.什么是事务

InnoDB 引擎下,MySQL 支持事务操作,事务拥有以下几个特点:

  • 原子性
  • 可靠性
  • 稳定性
  • 隔离性

使用事务的操作,要么执行,要么不执行,只有一个结果,但是事务可以回滚,也就是撤回操作。

10.说一下悲观锁、乐观锁

InnoDB 引擎下的 MySQL 在处理高并发时,会对 MySQL 数据库添加锁机制,以此完成并发的要求,并保证数据的完整性,可靠性。

悲观锁是 MySQL 为数据库添加行锁,强行为多个事务排序,阻塞事务运行,解决事务之间的冲突问题,但是事务之间有可能出现长时间等待,且开锁、解锁需要额外的数据库资源消耗。所以要谨慎使用。

乐观锁没有锁机制,但是引入了版本号控制,在高并发时,数据库在事务提交之前会进行版本号校验,如果版本后前后不一致,说明此刻有其他事务正在操作,那么本次事务重新操作。

版本号的好处在于没有锁的开销,并且只在事务最后提交更改时进行判断,但是也要考虑重新执行的代价是否过大。

总的来说,高并发下,读操作多的时候,使用乐观锁,写的操作时,使用悲观锁。

未更完,下次更新补上。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

「Python 面试」第五次更新 的相关文章

随机推荐

  • js 对数组对象进行排序

    let listData id 1 name 测试1 presenttime 1557883600000 id 2 name 测试2 presenttime 1580751813000 id 3 presenttime 1561448381
  • svn版本号,命令中-r 2和@2的区别

    问题 假设有一个svn repository是 svn 192 168 2 6 project 在版本1 20的svn里 存在 svn 192 168 2 6 project branches branch test 在版本21时 由于br
  • BUUCTF-Web-命令执行-[ACTF2020 新生赛]Exec

    BUUCTF Web 命令执行 ACTF2020 新生赛 Exec 题目链接 BUUCTF 类型 命令注入 知识点 命令拼接符 解题过程 这道题目比较简单 打开发现是一个ping命令执行页面 使用post接受参数 测试命令拼接符 发现未进行
  • CMW500测试设置及问题处理

    测试CATM1需要打开eMTC Auto Mode 最新的U BLOX R510S模块 这里需要设置为RMC模式 设置为eMTC Auto Mode会出现连接后就断开的情况 没法测试 Measure subframe设置为5 不同的band
  • Kubernetes生产实践系列之三十一:Kubernetes基础技术之CPU资源的调度和管理(CFS)

    一 前言 在使用Kubernetes的过程中 我们看到过这样一个告警信息 K8S 告警主题 CPUThrottlingHigh 告警级别 warning 告警类型 CPUThrottlingHigh 故障实例 告警详情 27 throttl
  • android bluetooth UUID蓝牙查询表

    UUID是 Universally Unique Identifier 的简称 通用唯一识别码的意思 对于蓝牙设备 每个服务都有通用 独立 唯一的UUID与之对应 也就是说 在同一时间 同一地点 不可能有两个相同的UUID标识的不同服务 以
  • .Net C# 使用 IKVM 调用 Java 代码

    相关开源库 https github com ikvm revived 版本号 Net 6 JDK 8 IKVM 8 2 1 IKVM 在 8 2 0 版本中新增加 IkvmReference 在 MSBuild 中配置 自动帮你编译jar
  • 虚拟机打开vim文件以后退出方式

    如果是vi 则 Esc 退出编辑模式 输入以下命令 wq 保存后退出vi 若为 wq 则为强制储存后退出 常用 w 保存但不退出 常用 w 若文件属性为 只读 时 强制写入该档案 q 离开 vi 常用 q 若曾修改过档案 又不想储存 使用
  • python制作查询工具发给别人使用_Python 制作查询商品历史价格的小工具

    一年一度的双十一就快到了 各种砍价 盖楼 挖现金的口令将在未来一个月内充斥朋友圈 微信群中 玩过多次双十一活动的小编表示一顿操作猛如虎 一看结果2毛5 浪费时间不说而且未必得到真正的优惠 双十一电商的 明降暗升 已经是默认的潜规则了 打破这
  • 为何在新建STM工程中全局声明两个宏

    在uVision中新建STM32工程后 需要从STM32标准库中拷贝标准外设驱动到自己的工程目录中 此时需要在工程设置 gt C C 选项卡下的Define文本框中键入这两个全局宏定义 STM32F40 41xxx USE STDPERIP
  • 二叉树的一些练习题

    前言 二叉树的简单题目 通过画栈帧图去理解过程 画一画 走一走递归过程 理解会更加深刻 二叉树练习题 前言 二叉树的创建 二叉树先序遍历创建 PreCreat 二叉树层次创建 LevelCreat 二叉树的销毁 BinaryTreeDest
  • 二分法查找数组元素

    二分法查找元素时可以节省下极高的效率 如果有2的32次方个元素 依次查找需要查找2的32次方次 然而二分查找最多只用查找32次 程序执行的时间极大的缩短 二分法查找元素 include
  • nginx中location里面的try_files配置导致Vue设置history模式下的请求丢失参数

    nginx中location里面的try files配置导致vue设置history模式下的请求丢失参数 背景描述 在一次生产环境中 vue使用history模式在访问地址的参数会丢失 地址栏也会变成没有参数的地址 并且请求会发生301重定
  • 快速排序算法详解(原理,时间复杂度,实现代码)

    快速排序算法详解 原理 实现和时间复杂度 快速排序是对冒泡排序的一种改进 由 C A R Hoare Charles Antony Richard Hoare 东尼 霍尔 在 1962 年提出 快速排序的基本思想是 通过一趟排序将要排序的数
  • sql 字段求和_VBA+SQL-常用函数

    SQL语句中的一些简单计算函数 如max函数 SELECT MAX 列字段 AS 别名1 FROM 工作表名 如AVG函数 SELECT AVG 列字段 AS 别名1 FROM 工作表名 使用实例说明 源数据 查询内容 对英语成绩最高分 对
  • 【Java基础】day13

    day13 一 Spring Bean 生命周期是怎样的 详细过程分为以下几个步骤 初始化 Bean 容器通过获取 BeanDefinition 中的信息进行实例化 这一步仅仅是简单的实例化 并没有进行依赖注入 实例化的对象被包装在 Bea
  • 脚手架搭建react项目遇到的问题?

    一 配置proxy代理 配置代理其实很简单 但是理解其中我还不是太懂 贴一下代码看一下配置吧 说一下我遇见的问题 因为以前用webpack配置需要在config里配置devServer 网查脚手架搭建的项目不用这么麻烦 直接package
  • 【100%通过率 】【华为OD机试c++/python】日志限流【2023 Q1

    华为OD机试 题目列表 2023Q1 点这里 2023华为OD机试 刷题指南 点这里 题目描述 某软件系统会在运行过程中持续产生日志 系统每天运行N单位时间 运行期间每单位时间产生的日志条数保行在数组 records中 records i
  • 小程序中的callback使用,及面临的风险

    1 前言 在项目开发中 初步逻辑是 获取用户的openid 2 使用openid去查询用户数据表中是否有这个用户 3 如果没有这个openid的用户 非key字段 新建一条用户数据 但在实际的操作者 发现数据库会存在如下图的情况 数据库中o
  • 「Python 面试」第五次更新

    1 说一下 char varchar text 的区别 这里先介绍一下数据库的概念 数据库是一种数据结构 内含多种算法 帮助我们将数据以最优化的方式存储在计算机中 也可以帮助我们快速找到存储的数据 数据最终存储在计算机中都是以 二进制 的方