摘要:也就是说当使用字符型存储数据后,该数据转换为二进制时的长度超过了位,那么该数据将不会完整存储,会丢失一部分数据。
阅读本文大约需要 8 分钟。写在前面
数据库打算只写 MySQL,Redis 两部分,不会很细,主要以面试题为主。这次写的是 MySQL 篇。
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类型数据在检索中,不会使用索引,而是使用全局搜索,这会产生临时表,使得检索时间变长,不推荐使用。
由于char和varchar的特性,在实际使用当中,如果该数据是经常会发生变化、经常使用的,那么推荐使用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 的内置函数。
尽量使用 EXISTS和BETWEEN代替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 为数据库添加行锁,强行为多个事务排序,阻塞事务运行,解决事务之间的冲突问题,但是事务之间有可能出现长时间等待,且开锁、解锁需要额外的数据库资源消耗。所以要谨慎使用。
乐观锁没有锁机制,但是引入了版本号控制,在高并发时,数据库在事务提交之前会进行版本号校验,如果版本后前后不一致,说明此刻有其他事务正在操作,那么本次事务重新操作。
版本号的好处在于没有锁的开销,并且只在事务最后提交更改时进行判断,但是也要考虑重新执行的代价是否过大。
总的来说,高并发下,读操作多的时候,使用乐观锁,写的操作时,使用悲观锁。
未更完,下次更新补上。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/45173.html
摘要:第五次组会这次组会我主要讲了,和的第一个问题。老师要我们搞明白的问题怎么识别拥塞流怎么识别拥塞流搞清楚怎么识别的两篇文章方法不同。 2021-11-28第五次组会 ...
摘要:当时自己在本地测试搭建集群后,给分配了另外一个任务就是去了解中的自带分词英文分词中文分词的相同与差异以及自己建立分词需要注意的点。还有就是官网的文档了,非常非常详细,还有,版本的是有中文的官方文档,可以凑合着看。 前提 人工智能、大数据快速发展的今天,对于 TB 甚至 PB 级大数据的快速检索已然成为刚需,大型企业早已淹没在系统生成的浩瀚数据流当中。大数据技术业已集中在如何存储和处理这...
摘要:因此,当任何由返回的函数被调用时,的值将在附近的范围进行查找。下面是解决这一问题的一些方法。另外一个解决方案就是创造一个闭包,利用默认函数立即绑定。当缺失时,执行类,字典的实例将自动实例化这个数列。 1、下面这段代码的输出结果是什么?请解释。 def extendList(val, list=[]): list.append(val) return list list...
阅读 624·2023-04-26 01:53
阅读 2751·2021-11-17 17:00
阅读 2882·2021-09-04 16:40
阅读 1986·2021-09-02 15:41
阅读 834·2019-08-26 11:34
阅读 1224·2019-08-26 10:16
阅读 1337·2019-08-23 17:51
阅读 816·2019-08-23 16:50