发表于: 2022-05-26 20:21:46

1 569



21.自增ID有什么坏处?什么样的场景下不使用自增ID?


1什么是自增ID(MySQL数据库)

自增ID是在设计表时如果将id字段的值设置为自增的形式也就是AUTO_INCREMENT,

那么当插入一行数据时就无需指定id,数据表会根据前一个id值+1进行填充。

指定了AUTO_INCREMENT的列必须要建索引,一般把ID作为主键,这样系统会自动为ID建立索引。

2自增ID有什么好处?

(1) 增加记录时,可以不用指定id字段,不用担心主键重复问题。

(2)数据库自动编号,速度快,而且是增量增长,按顺序存放,对于检索非常有利;

(3)数字型,占用空间小,易排序,在程序中传递也方便;


3自增ID有什么坏处?

(1) 不具有连续性,表中auto_increment最大值被删除,将不会被重用。就是说会跳号(如果设定的auto_increment_increment是1,

          那么下一次插入的id值将会从被删除的最大值算起,也就是被删除的最大值+1)

(2)历史数据表的主键id会与数据表的id重复,两张自增id做主键的表合并时,id会有冲突,但如果各自的id还关联了其他表,这就很不好操作。

(3) 很难处理分布式存储的数据表,尤其是需要合并表的情况下

(4) 在系统集成或割接时,如果新旧系统主键不同是数字型就会导致修改主键数据类型,这也会导致其它有外键关联的表的修改,后果同样很严重


4.什么场景下不使用自增ID

正是因为自增ID的缺点也就是无法在多个表中,或者多个数据库中保持ID主键唯一不重复,

所以若是使用分布式数据库以及数据合并的情况下时不能使用自增ID的。

若是能够有其他的字段能作为主键保证唯一性,无需使用自增ID


5.自增ID的替代者UUI

UUID含义是通用唯一识别码 (Universally Unique Identifier),指在一台机器上生成的数字,

它保证对在同一时空中的所有机器都是唯一的。通常平台会提供生成的API。换句话说能够在一定的范围内保证主键id的唯一性。


6.UUID存在的目的

UUID的目的,是让分布式系统中的所有元素,都能有唯一的辨识信息,而不需要通过中央控制端来做辨识信息的指定。如此一来,

每个人都可以创建不与其它人冲突的UUID。在这样的情况下,就不需考虑数据库创建时的名称重复问题。也就完美解决的自增ID的缺点。



------------------------------------------------------------------------------------------

22.什么是DB的索引,多大的数据量下建索引会有性能的差别,什么样的情况下该对字段建索引?


 索引 是对数据库表中一个或多个列(例如,employee 表的姓名 (name) 列)的值进行排序的结构

索引的作用:

提高查询速度

确保数据的唯一性

可以加速表和表之间的连接 , 实现表与表之间的参照完整性

使用分组和排序子句进行数据检索时 , 可以显著减少分组和排序的时间

全文检索字段进行搜索优化


1.索引的分类

·主键索引:Primary Key

唯一的标识,主键不可重复,且只能有一个列作为主键。

特点 :

最常见的索引类型

确保数据记录的唯一性

确定特定数据记录在数据库中的位置


·唯一索引:Unique Key

避免重复的列出现,唯一索引可以重复,每个列都可以标识为唯一索引。

与主键索引的区别:

主键索引只能有一个

唯一索引可能有多个


·常规索引:Key/Index

默认的,使用Index或者Key关键字来设置。

注意 :

index 和 key 关键字都可以设置常规索引

应加在查询找条件的字段

不宜添加太多常规索引,影响数据的插入,删除和修改操作


·全文索引:FullTest

在特定的数据库引擎下才有,MyIsam。

作用 : 快速定位特定数据

注意 :

·只能用于MyISAM类型的数据表

·只能用于CHAR , VARCHAR , TEXT数据列类型

·适合大型数据集


索引的优点:优化查询速度

索引的缺点:因为每次写入数据时索引都需要重新整理导致数据库开销大,创建的索引等于是将索引字段复制了一部分所以存储消耗也相应的增大。


多大的数据量下建索引会有性能的差别

数据量超过300的表应该有索引;

经常与其他表进行连接的表,在连接字段上应该建立索引;

经常出现在Where子句中的字段,特别是大表的字段,应该建立索引;

什么样的情况下该对字段建索引?

在选择性高的字段下设置索引。


-------------------------------------------------------------------------------------------------

23.唯一索引和普通索引的区别是什么,什么时候需要建唯一索引。


·唯一索引:Unique Key

避免重复的列出现,唯一索引可以重复,每个列都可以标识为唯一索引。

与主键索引的区别:

主键索引只能有一个

唯一索引可能有多个


·常规索引:Key/Index

默认的,使用Index或者Key关键字来设置。

注意 :

index 和 key 关键字都可以设置常规索引

应加在查询找条件的字段

不宜添加太多常规索引,影响数据的插入,删除和修改操作


什么时候创建唯一索引?

例如某条件经常使用的字段,而字段数据又是唯一的,那么这时候就可以创建唯一索引了。


---------------------------------------------------------------------------------------------------------

24.如果对学员QQ号做了一个唯一索引,在插入数据的时候,是否需要先判断这个QQ号已经存在了?


* 安全创建索引的存储过程:  

* 首先判断索引是否存在,如果已经存在则不创建,如果不存在,则创建。  

* 防止索引已经存在,创建出错和删除索引重复创建原来的索引带来的开销浪费  


----------------------------------------------------------------------------------------------

25.CreateAt和UpdateAt的意义分别是创建时间和修改时间,这两个时间应该在什么情况下赋值?是否应该开放给外部调用的接口?


我们在创建数据库表时,有CreateAt,UpdateAt,CreateBy,UpdateBy四个字段,这四个字段是为了记录数据库表的每一次操作。

字段含义:

CreateAt:创建时间

UpdateAt:更新时间

CreateBy:创建人

UpdateBy:更新人

字段类型:

CreateAt:bigint

UpdateAt:bigint

CreateBy:Varchar

UpdateBy:Varchar

CreateAt和UpdateAt两个时间应该在什么情况下赋值

CreateAt/CreateBy是在数据新建时获取的,以后这个字段不会再变化。

UpdateAt/UpdateBy是在数据进行修改操作时获取的,随着每一次的修改而做出相应的变化。

是否应该开放给外部调用的接口?

如果是查询接口调用,是可以的。

如果是修改或者删除等其他接口,是不可以开放的。这两个字段涉及到对数据库操作的记录,只能由代码来自动控制,而不能把权限放开

-------------------------------------------------------------------------------------------------

26.修真类型应该是直接存储Varchar,还是应该存储int? 


1、varchar(N)的逻辑意义
从MySQL4.1开始,varchar (N)中的N指的是该字段最多能存储多少个字符(characters),不是字节数。
不管是一个中英文字符或者数字、或者一个汉字,都当做一个字符。在4.1之前,N表示的是最大存储的字节数(bytes)。


2、varchar(N)到底能存多长的数据
在mysql reference manual上,varchar最多能存储65535个字节的数据。varchar 的最大长度受限于最大行长度(max row size,65535bytes)。

65535并不是一个很精确的上限,可以继续缩小这个上限。65535个字节包括所有字段的长度,

变长字段的长度标识(每个变长字段额外使用1或者2个字节记录实际数据长度)、NULL标识位的累计。
NULL标识位,如果varchar字段定义中带有default null允许列空,则需要需要1bit来标识,每8个bits的标识组成一个字段。

一张表中存在N个varchar字段,那么需要(N+7)/8 (取整)bytes存储所有的NULL标识位。
如果数据表只有一个varchar字段且该字段DEFAULT NULL,那么该varchar字段的最大长度为65532个字节,即65535-2-1=65532 bytes。


从字段类型的执行效率上,int最高,varchar最低。
状态类型字段,使用char或者varchar是不可取的,int类型更容易建立索引和进行检索,毕竟数字类型是数据库检索的基础,char类型的毕竟需要经过转换,而varchar就更复杂了,其排序不仅需要转换和计算,还需要访问和遵循数据库的排序规则(实际上char也需要排序规则),而消耗的资源也更大。
因此,通常在数据库设计中,都是尽量使用int类型字段而不是字符类型字段,这在大型和超大型数据库的优化中,有明显的性能差异。


---------------------------------------------------------------------------------------------------------------

27.varchar类型的长度怎么确定?有什么样的原则,和Text和LongText的区别是什么?


varchar字段长度 = 字符串长度值 + 实际数据长度 N。

字符串长度值视实际数据长度,需占用 1 或 2 个字节存储。因此我们得出:

当实际数据长度 <= 255 时,varchar字段长度 = 1 + N;

当实际数据长度 > 255 时, varchar字段长度 = 2 + N;


字符串的长度是在字符串中字符的数目 (序列的长度),它可以是任何非负整数。

n 必须是一个介于 1 和 8,000 之间的数值。 存储大小为输入数据的 字节的实际长度 ,而不是 n 个字节。


什么是VARCHAR、Text、LongText?

它们都是MySQL数据库的字符串类型,用来存储字符数据。区别是存储的数据长度、大小不一样。我们可以根据需求选择使用哪种字符串类型。

需要注意的是:

mysql数据库的varcahr类型在4.1以下版本中最大长度限制为255字节

mysql5.0以上的版本中varchar数据类型的长度支持到了65535字节。

Text和LongText 也是长度可变的类型

Text的最大长度是可以存储 65535 (2^16 – 1) 个字符

LongText的最大长度是可以存储4294967295 (2^32 – 1) 个字符。



和Text和LongText的区别是什么?

  • VARCHAR中的VAR表示您可以将最大大小设置为1到65,535之间的任何值。 TEXT字段的最大固定大小为65,535个字符。
  • VARCHAR可以是索引的一部分,而TEXT字段要求您指定前缀长度,该长度可以是索引的一部分。
  • VARCHAR与表内联存储(至少对于MyISAM存储引擎而言),因此在大小合理时可能会更快。当然,快得多少取决于您的数据和硬件。
  • 同时,TEXT存储在表外,该表具有指向实际存储位置的指针。
  • 排序使用TEXT列将需要使用基于磁盘的临时表作为MEMORY(HEAP)存储引擎。



而longtext也是变长字符存储,只保存字符数据,最长为4294967295字节,比较适合存储大内容

------------------------------------------------------------------------------------------------------------------------------------------

28.怎么进行分页数据的查询,如何判断是否有下一页?


一般情况下在MySQL中进行分页查询时,会用到limit查询,而且在查询中都会使用到order by来进行排序。


什么是分页

分页是将所有数据分段展示给用户的技术,用户看到的只是全部数据的其中一部分,用户可以通过页码或是翻页来进行跳转,知道找到自己想看到的内容。


在何处进行分页

可以进行分页处理的地方有:1客户端,2服务器,3数据库端。在客户端进行分页,需要进行传输的数据量很大,

必然加大服务器的负载。在服务器端进行分页,大部分数据还是会被传输到服务器端。

所以,比较好的分页做法应该是每次翻页的时候只从数据库里检索相应页面大小的数据



先通过SQL语句“select  count(*) from  表名 ” 查询表中的数据总条数


查询第1条到第10条的数据的sql是:
select * from table limit 0,10;

对应我们的需求就是查询第一页的数据:

select * from table limit (1-1)*10,10;

从上面的分析我们可以得出分页sql的格式是:

select * from table limit (start-1)*limit,limit;

其中start是页码,limit是每页显示的条数。


判断下一页的步骤也省略了,在前面就直接算出来了总页数,我们是知道最后一页是哪一页。

------------------------------------------------------------------------------------------------------

29.为什么不可以用Select * from table?

我们经常听到查询表,只要查询自己想要的字段,不需要的字段就不要查询,严禁使用 select *,我们能想到很直观的理由就是,

数据库要帮你翻译成每个字段名去查询,接着查询多余的字段会占用内存,带宽等资源。这确实是一个理由,

而且这个理由很重要,但是我这里想说的是另外一个原因,覆盖索引

覆盖索引的意思是指查询使用联合索引覆盖了要查询的字段,这样数据库不用去进行回表,从而减少IO,提高性能。


-------------------------------------------------------------------------------------------------------------

30.maven是什么,和Ant有什么区别?


Maven的本质是一个项目管理工具,(Maven是java语言编写的,所以Maven管理的东西,都已面向对象的方式进行设计),

将项目开发和管理过程抽象成一个项目模型(POM)

POM(Project Object Model):项目对象模型


Ant是Java的生成工具,是Apache的核心项目;

Ant类似于Unix中的Make工具,都是用来编译、生成;

Ant是跨平台的,而Make不能;

Ant的主要目的就是把你想做的事情自动化,不用你手动一步一步做,

因为里面内置了javac、java、创建目录、复制文件等功能,所以可以直接点击Ant文件,即可编译生成你的项目。

maven和ant的区别:

Maven拥有约定,只要遵守约定,它就知道你的源代码在哪里。Maven是声明式的。你需要做的只是创建一个pom.xml 文件然后将源代码放到默认的目录。

Maven会帮你处理其它的事情。Maven有一个生命周期,当你运行mvn install的时候被调用。这条命令告诉Maven执行一系列的有序的步骤,

直到到达你指定的生命周期。缺点是运行许多默认目标。而ant没有约定,项目生命周期,它是命令式的。所有操作都要手动去创建、布置。

甚至连build.xml文件都需要手动创建。






明天计划:将任务一完成







返回列表 返回列表
评论

    分享到