发表于: 2020-05-01 23:12:12

1 1362


今天完成的事情:今天完成了数据库的深度思考
明天计划的事情:明天白天有事,可能要晚上才会学习看会java基础书
遇到的问题:关于
CreateAt和UpdateAt的意义分别是创建时间和修改时间,这两个时间应该在什么情况下赋值?是否应该开放给外部调用的接口?

个问题最后还问是否开放给外部调用接口,直接就只是数据库表中的两个字段干嘛要给单独调用接口,要获取直接查找不就完了

收获:如下

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

普通索引(INDEX

唯一任务是加快对数据的访问速,应该只为那些最经常出现在查询条件(WHEREcolumn=)或排序条件(ORDERBYcolumn)中的数据列创建索引。

唯一索引(UNIQUE 

不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。
在对该列进行增或改时,首先会检查是否重复,在执行增改操作,否则报出duplica错误,拒绝操作.

使用索引的场景:        
1、装载数据后再建立索引。  
2、频繁搜索的列可以作为索引。    
3、在联接属性上建立索引(主外键)。    
4、经常排序分组的列
5、删除不经常使用的索引。   
6、指定索引所在的表空间,将表和索引放在不同的表空间上可以提高性能。   
7、对大型索引,使用NOLOGGING子句创建大型索引。

l  如果你指定了LOGGING,那么创建数据库对象,以及后续的插入操作,都会记录到重做日志文件中。

l  如果你指定了NOLOGGING,那么创建数据库对象,以及后续的常规插入操作,都会被记录到重做日志文件中。直接路径插入将不会记录重做日志。


不要在下面的列创建索引:
1、仅包含几个不同值得列。
2、表中仅包含几条记录。

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

可以判断,因为唯一索引使用条件是,插入的记录的索引列必须是唯一,不能有重复值。要先判断是否存在

如果考虑到性能方面,就不做判断,因为判断时候会从新连接到数据库

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

在什么情况下赋值以及怎么赋值:

1.对记录进行更新是复制

2.怎么实现

假设表有3个字段:id、name、update_time,希望在新增记录时能自动设置update_time字段为当前时间

设置DEFAULT CURRENT_TIMESTAMP即可

CREATE TABLE `test` (

`id` int NOT NULL,

`name` varchar(255),

`update_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP,

PRIMARY KEY (`id`)

) COMMENT='';

如果使用Navicat建表就是在图红框中选择默认值为CURRENT_TIMESTAMP

如果希望在更新记录时还能自动更新update_time字段为当前时间

设置ON UPDATE CURRENT_TIMESTAMP

CREATE TABLE `test` (

`id` int NOT NULL,

`name` varchar(255),

`update_time` timestamp NOT NULL ON UPDATE CURRENT_TIMESTAMP DEFAULT CURRENT_TIMESTAMP,

PRIMARY KEY (`id`)

) COMMENT='';

如果使用Navicat建表就是在图绿框中勾选上根据当前时间戳更新

这样设置之后,即使直接通过Navicat工具修改了name字段,那么update_time也会自动更新,除非手动设置了update_time字段

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

不开放,

1.api的认识。

API(应用程序接口)是一些预先定义的函数,或指软件系统不同组成部分衔接的约定。目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问原码,或理解内部工作机制的细节。

应用程序接口又称为应用编程接口,是一组定义、程序及协议的集合,通过 API接口实现计算机软件之间的相互通信。API 的一个主要功能是提供通用功能集。API同时也是一种中间件,为各种不同平台提供数据共享。程序设计的实践中,编程接口的设计首先要使软件系统的职责得到合理划分。良好的接口设计可以降低系统各部分的相互依赖,提高组成单元的内聚性,降低组成单元间的耦合程度,从而提高系统的可维护性和可扩展性。

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

Varchar是字符串型,int是数值型,按照效率的话用int较好,但是要注释备注int数值对应的修正院类型

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

ASCII码:一个英文字母(不分大小写)占一个字节的空间。一个二进制数字序列,在计算机中作为一个数字单元,一般为8位二进制数。换算为十进制,最小值-128,最大值127。如一个ASCII码就是一个字节。
UTF-8编码:一个英文字符等于一个字节,一个中文(含繁体)等于三个字节。中文标点占三个字节,英文标点占一个字节
Unicode编码:一个英文等于两个字节,一个中文(含繁体)等于两个字节。中文标点占两个字节,英文标点占两个字节

数据库中保存可变长度的字符串的是varchar,long,longText,固定用char,比如应用在邮政编码等,

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

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

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

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

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

varchar类型的长度怎么确定?

具实际情况而定,用户名,谁的名字会有255/3=85个字符?所以也没必要那么长,但又不能定义成CHAR(),所以给个够用的长度varchar(20)或更少varchar(10)即可,考虑少数民族可以长点。 varchar的长度,最好是够用就行。

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

看了师兄的简书,先记录下,后面写到数据库时候,手动操作下。

分页查询就是将过多的结果在有限的界面上分成多页来显示,

一般将分页查询分为两类:逻辑分页、物理分页。

逻辑分页

在用户第一次访问时,将数据库的所有记录全部查询出来添加到一个集合中,然后存放在session对象,再通过页码计算出当前页需要显示的数据,存储到一个小的list的集合中,再将其存储到request对象中,跳转到JSP页面,进行遍历显示

当用户第二次访问时,只要不关闭浏览器,还是从session中获取数据来显示。因为这种方法是在内存的session对象中进行计算分页显示的,而不是真正的将我们数据库进行分页的,所以叫做逻辑分页。

缺点:如果查询的数据量过大,session将耗费大量的内存;因为是在session中获取数据,如果第二次或者更多次的不关闭浏览器访问,会直接访问session,而不能保证数据是最新的。

物理分页,使用Mysql数据库中的limit机制来完成分页操作。因为是对数据库的数据进行分页条件查询,所以叫物理分页。每一次物理分页都会去连接数据库。

优点:数据能够保证最新,由于根据分页条件会查询出少量的数据,所以不会占用太多的内存。

物理分页实现

将当前页,显示记录数,总记录数,总页数,当前页记录集合。

将查询数据存储到一个对象中的当前页记录集合属性中。

总页数:总记录行数/每页数量,向上取整。

如何判断是否有下一页:所以总页数就是向上取整得到的数字,当前页只要大于这个数字,就没有有下一页了


返回列表 返回列表
评论

    分享到