发表于: 2017-11-28 08:46:30
14 1394
1.创建索引
在创建索引前查阅相关的资料(关于索引创建)
在执行CREATE TABLE语句时可以创建索引,也可以单独用CREATE INDEX或ALTER TABLE来为表增加索引。
1.ALTER TABLE
ALTER TABLE用来创建普通索引、UNIQUE索引或PRIMARY KEY索引。
1 2 3 | ALTER TABLE table_name ADD INDEX index_name (column_list) ALTER TABLE table_name ADD UNIQUE (column_list) ALTER TABLE table_name ADD PRIMARY KEY (column_list) |
其中table_name是要增加索引的表名,column_list指出对哪些列进行索引,多列时各列之间用逗号分隔。索引名index_name可选,缺省时,MySQL将根据第一个索引列赋一个名称。另外,ALTER TABLE允许在单个语句中更改多个表,因此可以在同时创建多个索引。
2.CREATE INDEX
CREATE INDEX可对表增加普通索引或UNIQUE索引。
1 2 | CREATE INDEX index_name ON table_name (column_list) CREATE UNIQUE INDEX index_name ON table_name (column_list) |
table_name、index_name和column_list具有与ALTER TABLE语句中相同的含义,索引名不可选。另外,不能用CREATE INDEX语句创建PRIMARY KEY索引。
3.索引类型
在创建索引时,可以规定索引能否包含重复值。如果不包含,则索引应该创建为PRIMARY KEY或UNIQUE索引。对于单列惟一性索引,这保证单列不包含重复的值。对于多列惟一性索引,保证多个值的组合不重复。
PRIMARY KEY索引和UNIQUE索引非常类似。事实上,PRIMARY KEY索引仅是一个具有名称PRIMARY的UNIQUE索引。这表示一个表只能包含一个PRIMARY KEY,因为一个表中不可能具有两个同名的索引。
下面的SQL语句对students表在sid上添加PRIMARY KEY索引。
ALTER TABLE students ADD PRIMARY KEY (sid)
4. 删除索引
可利用ALTER TABLE或DROP INDEX语句来删除索引。类似于CREATE INDEX语句,DROP INDEX可以在ALTER TABLE内部作为一条语句处理,语法如下。
1 2 3 | DROP INDEX index_name ON talbe_name ALTER TABLE table_name DROP INDEX index_name ALTER TABLE table_name DROP PRIMARY KEY |
其中,前两条语句是等价的,删除掉table_name中的索引index_name。
第3条语句只在删除PRIMARY KEY索引时使用,因为一个表只可能有一个PRIMARY KEY索引,因此不需要指定索引名。如果没有创建PRIMARY KEY索引,但表具有一个或多个UNIQUE索引,则MySQL将删除第一个UNIQUE索引。
如果从表中删除了某列,则索引会受到影响。对于多列组合的索引,如果删除其中的某列,则该列也会从索引中删除。如果删除组成索引的所有列,则整个索引将被删除。
5.查看索引
1 2 | mysql> show index from tblname; mysql> show keys from tblname; |
给姓名添加一个索引
在命令行的命令: ALTER TABLE stu_information ADD INDEX user(username);
添加前没有username
添加后username有了索引
打开表的结构里面也可看见索引 user
一般有(1) PRIMARY KEY索引
(2) 简单普通的索引 INDEX
(3) 唯一索引 UNIQUE
所以--->在字段中 id主键 username姓名 还可以city城市(这些一般经常查询筛选)
接下来插入了一下数据测试一下有么有索引的查询速度:
插入数据
没有索引的查询
select * from stu_information where username='老大';
通过索引相关联在查询数据字段的时候不会遍历整个数据库的数据相关的字段,索引就极大的增强了查询的效率,节约时间.
5.为什么DB的设计中要使用Long来替换掉Date类型?
讨论DB中的两个类型:
①:bigint从 -2^63 (-9223372036854775808) 到 2^63-1 (9223372036854775807) 的整型数据(所有数字)。
②:DATE 用于表示 年月日,取值范围:1000-01-01~9999-12-31。
因为DATE有固定的格式,不同的地区有不同的时间表示方法,而且外国有夏令时与冬令时之分,非常麻烦
大多数时候我们并不关心某一个时间点,而是发生一个动作后,需要的时间,BigInt非常方便做减法而不用转化
6.自增ID有什么坏处?什么样的场景下不使用自增ID?
缺点:for example, 在做分布式数据库时,要求数据同步时,这种自增ID就会出现严重的问题,因为你无法用该ID来唯一标识记录。同时在数据库做移植时,也会出现各种问题,总之,对此自增ID有依赖的情况,都有可能出现问题。
一般分布式的不会用id自增
7.什么是DB的索引,多大的数据量下建索引会有性能的差别,什么样的情况下该对字段建索引?
索引是对数据库表中一列或多列的值进行排序的一种结构,只有当经常查询索引列中的数据时,才需要在表上创建索引。索引占用磁盘空间,并且降低添加、删除和更新行的速度。当然索引也有好处就是查询速度快,它利还是大于弊的所以请慎重使用索引。
8.唯一索引和普通索引的区别是什么,什么时候需要建唯一索引。(个人的理解)
针对唯一索引:唯一索引扫描取回一行数据即可返回,快速的查询你想要的额结果(需要查询的数据不多时候,并且是唯一的标识或者是唯一的约束)
针对普通索引:普通索引要确认是否已取回所有数据,至少要多读取一行(普通索引要确保将所有的数据都要读取,这个针对多的大量的数据需要被查询的时候)
9.如果对学员QQ号做了一个唯一索引,在插入数据的时候,是否需要先判断这个QQ号已经存在了?
不需要,因为QQ有唯一索引,会检查有没有重复,有就不插入,没有就插入到数据库里面
10.CreateAt和UpdateAt的意义分别是创建时间和修改时间,这两个时间应该在什么情况下赋值?是否应该开放给外部调用的接口?
CreateAt 是在表创建的时候被赋予值 不会给外部的接口
UpdateAt 在每次更新体检数据的时候 被赋予值 也不会给外部接口
11.修真类型应该是直接存储Varchar,还是应该存储int?
修真的类型应该用varchar
12.varchar类型的长度怎么确定?有什么样的原则,和Text和LongText的区别是什么?
varchar 类型的长度根据对应的字段的需求来确定
varchar---->类型把它(定义时规定上限)视为最大值并且只使用了存储字符串实际上需要的字节数(增加一个额外的字节记录长度)。因而较短值被插入道varchar中不会用空格填补,但在较长时仍被截断。所占空间为字符串实际长度加1,最长为65535个字节
Text----------->TEXT相对于varchar能接收的字符串更长,也就是说多于varchar的255个字符
LongText----->longtext也是变长字符存储,只保存字符数据,最长为4294967295字节,比较适合存储大内容
选取长度的原则:
1、对于一般性录入字段,如:编号,轴号,车号,不要为了一时的"绝对"而设置确定的长度,最好统一成较优的长度,如32位!
如:车号最早是6位,没多久就改成了7位! 轴号开始为8位,但实际上有15位的轴号!轴承编号由10改为了20位
2、对于类似名称的字段: 如单位名称, 数据字典项目的名称等,最好再大一些,设成60位!
3、对于备注类型的字段,一般内容在30个汉字左右,所以推荐设置为100
4、对于长文本的字段,一般内容在200个汉字左右,推荐设置为1000
5、对保存SQL语句的字段(特殊情况,如配置传输条件等),至少要设置为2000,最大是4000 等等
13.怎么进行分页数据的查询,如何判断是否有下一页?
第一种:前端分页,一次性返回所有数据,然后在前端进行处理渲染,好处,只需要请求一次服务器即可,较少前后端交互,适用场景一般数据量较少,并且会经常看第二页第三页这样的数据
第二种:后端分页,一次只返回每次请求的条数,前段所需要传的参数的页码(index)和页容量(size),后端进行判断处理(主要是各种兼容,比如,如果前段不传index和size怎么处理,或者传的index过大,查不到数据怎么处理,这个就见仁见智了),返回数据格式为总条数(total),和当前的数据(data),前端去展示,好处,每次只返回少量的数据,比如10条,处理比较快,这种每次点击分页都会向后端发送一次请求,适用于有大量数据的场景,防止一次性返回过多数据导致页面卡死
如何判断是否有下一页?不知道查了资料也没用明白---------->师兄看见(请详细讲解一下)
14.为什么不可以用Select * from table?
最好不要大小写乱写,统一SQL语句的规范,以免后面的java里面jdbc连接出问题
下面是查找师兄的日报(师兄的日报)
5.为什么DB的设计中要使用Long来替换掉Date类型?
数据库比较高效和安全。
在mysql中long对应bigint类型。所以问题改成bigint与date的区别。
Long对应的是-2^63----2^63-1之间的所有整型数据
Date对应日期 年月日 1000-01-01-----9999-12-31
使用bigint来替换date的好处是:date会受到时区的限制,并且有时候不需要获取当时的时间。格式也会受到限制。Bigint对时间差的处理更加方便。并且也可以清楚表示出时间的信息。date类型只在MySQL中有意义,在java中并没有这种格式。
6.自增ID有什么坏处?什么样的场景下不使用自增ID?
坏处:不具有连续性;不能识别重复信息;
不使用自增id:当数据中存在唯一标识符时就可以不使用;数据需要经常修改时不使用。
7.什么是DB的索引,多大的数据量下建索引会有性能的差别,什么样的情况下该对字段建索引?
DB索引:db的索引相当于书的目录,在查找书中内容的时候可以快速的锁定位置,如果没有索引,就需要自己从书的第一页翻到最后一页来查找。
索引的建立是根据表中的一列来建立,建立索引会对数据进行排序,从而在查找时更加方便快捷。建立索引只是存储数据的一列的值,而不是所有列。索引除了保存这列的值,还会保存一个指向这一行的指针,这样就可以在列中找到数据后获得整行的指。否则只能获取某一个值是没有意义的。索引存储的时候(“Jesus”, 0x82829)。
索引一般使用b-tree来创建数据结构。
B_TREE的查找
在B_TREE上查找x,现将x的关键字与根结点的n个关键字di逐个比较,然后做如下处理:
若x.key==di,则查找成功返回;
若x.key<d1,则沿着指针c0所指的子树继续查找;
若di<x.key<d(i+1),则沿着指针ci所指的子树继续查找;
若x.key>dn,则沿着指针cn所指的子树继续查找。
8.唯一索引和普通索引的区别是什么,什么时候需要建唯一索引。
普通索引可以有重复数据出现,唯一索引只可以有一条数据。
需求中出现不可重复的时候可以使用唯一索引。
9.如果对学员QQ号做了一个唯一索引,在插入数据的时候,是否需要先判断这个QQ号已经存在了?
不需要,唯一索引会自动查找是否重复,如果存在就不能插入。
10.CreateAt和UpdateAt的意义分别是创建时间和修改时间,这两个时间应该在什么情况下赋值?是否应该开放给外部调用的接口?
CreateAt是在建立时更新,UpdateAt在修改后更新。不用外部调用,可以使用触发器赋值。
11.修真类型应该是直接存储Varchar,还是应该存储int?
都可以,int和varchar可以互相转化。Int中可以存储4个字节,varchar可以存储255字符,65535字节。
12.varchar类型的长度怎么确定?有什么样的原则,和Text和LongText的区别是什么?
根据实际的意义来确定,比如姓名就需要比较少的字符,可以大概进行计算汉字,字母数字占得字符数来分配。
TINYTEXT 最大长度是 255 (2^8 - 1) 个字符。
TEXT 最大长度是 65535 (2^16 - 1) 个字符。
MEDIUMTEXT 最大长度是 16777215 (2^24 - 1) 个字符。
LONGTEXT 最大长度是 4294967295 (2^32 - 1) 个字符
13.怎么进行分页数据的查询,如何判断是否有下一页?
暂时不写,后面接触到了再答
14.为什么不可以用Select * from table?
之前我也是用的select,不太清楚为什么不可以,我之前遇到的问题是没有使用数据库。Use 数据库名称;就可以了。
总结知识:
今天完成的事情:就是在完成相关的任务前,去重新学习了索引的创建和分类的情况,并且了解了以前没有注意到的细节,就是索引用SQL语句创建的时候怎么样的去编写,还有对于不同的字段名,需要查询的不同的数据量或者的关键词(主键)-->用到的索引是不同的有区分,对于唯一的索引一般针对主键来被设定,要的是能够在最快的时间里面被查询到(一般查询的数据量比较小,而且要求比较准确快速的返回想要的值),针对普通的索引,就是要同时查询大量的的数据,
确认是否已取回所有数据,至少要多读取一行(普通索引要确保将所有的数据都要读取,这个针对多的大量的数据需要被查询的时候),对索引有了更深入的了解.
还有深度思考里面的相关的db的一些思考:上面的我自己的一些相关的了解知识,关于数据varchar和text和longtext的区别分别有了重新的认识,我就对在字符的区域的大小来区分,还有存储不同的数据的应用场景,不知道上面的有没有有一些的错误,或者是不是说很准确的地方,请师兄指出,并且给予我一些讲解我的知识盲区在哪里,师兄每次的评语都有认真的去阅读.
明天的任务:是学习安装java的环境还有配置还有maven的安装,还有本地的 .m2 的厂库的实现,看一下前面完成,能够完成jdbc 的链接可以不(时间允许)
问题很多(麻烦师兄讲解了): 1.----->5.为什么DB的设计中要使用Long来替换掉Date类型? 关于这个我看了资料不是很明白什么意思,关于这个的描述,
因为DATE有固定的格式,不同的地区有不同的时间表示方法,而且外国有夏令时与冬令时之分,非常麻烦
大多数时候我们并不关心某一个时间点,而是发生一个动作后(这个我能够明白)--->其他的就是一些关于那个的大小,不知道那些比较重点,那些是常被在开发中用到的.
2.自增ID 里面的理解完整不,我自己了解基本上这个样子,还有不足请师兄指出.
3.如何判断是否有下一页?不知道查了资料也没用明白---------->师兄看见(请详细讲解一下)
4.------>14.为什么不可以用Select * from table? 这个不知道解释清楚没有(自己感觉没有对)
收获:对db这块的索引有了更深入的了解,还有在不同的场景会用到不同的索引,还有针对字段的一些更多的理解,在使用的范围,还有存储的数据的大小,还有数据的类型来觉定,选用不同的数据类型,索引给我带来的好处,还有id不是每个表的设计都是自增的,自增有好处,单页可能带来不便,基本前期的SQL的知识重新又深入的回顾了一下,对SQL语句的熟悉度有所的提升.
最后感谢师兄每天的指导,和对我学习的一个监督,勿忘初心,坚持到底------------> :)
评论