发表于: 2018-03-29 00:12:10
1 720
MySQL数据库数据类型学习总结:
(1) 整数类型
l tinyint 很小整数 1byte
l smallint 小整数 2byte
l mediumint 中等整数 3byte
l int(Integer) 整数 4byte
l bigint 大整数 8byte
(2) 浮点和定点数类型
l float 单精度浮点 4byte
l double 双精度浮点 8byte
l decimal(M,D) 严格定点数 M+2byte
(3) 日期与时间类型
l year YYYY 1901~2155 1byte
l time HH:MM:SS -838:59:59~838:59:59 3byte
l date YYYY-MM-DD 1000-01-01~9999-12-31 3byte
l datetime YYYY-MM-DD HH:MM:SS 1000-01-01 00:00:00~9999-12-31 23:59:59 8byte
l timestamp YYYY-MM-DD HH:MM:SS 1970-01-01 00:00:01 UTC~ 2038-01-19 03:14:07 UTC 4byte
(4) 字符串
l char(M) 固定长度非二进制字符串 M字节,1<=M<=255
l varchar(M) 变长非二进制字符串 L+1字节,L<=M和1<=M<=255
l tinytext 非常小的非二进制字符串 L+1字节,L<2^8
l text 小的非二进制字符串 L+2字节,L<2^16
l mediumtext 中等大小的非二进制字符串 L+3字节,L<2^24
l longtext 大的非二进制字符串 L+4字节,L<2^32
l enum 枚举类型,仅有一个枚举字符串值 1或2个字节,取决于枚举值数目(最大值65535)
l set 字符串对象,有零个或多个字符串成员 1,2,3,4或8个字节取决于集合成员数量(最多64个成员)
(5) 二进制类型
l Bit(M) 位字段类型 大约(M+7)/8个字节
l Binary(M) 固定长度二进制字符串 M个字节
l Varbinary(M) 可变长度二进制字符串 M+1个字节
l Tinyblob(M) 非常小的blob L+1字节,L<2~8
l Blob(M) 小的blob L+2字节,L<2~16
l Mediumblob(M) 中等大小的blob L+3字节,L<2~24
l Longblob(M) 非常大的blob L+4字节,L<2~32
如何选择数据类型:
(1)整数和浮点数
有小数用浮点数,没有就用整数。但注意浮点数存储小数时会自动进行四舍五入。浮点包括float和double。double比float要求的精度更高,所以当要求存储精度高时用double。
(2)浮点数和定点数
浮点数float和double相对于定点数decimal来说优点是:在长度一定的情况下浮点数表示的范围更大。但由于浮点数容易产生误差,因此,如果对精度要求比较高则用decimal来存储。
Decimal在MySQL中是以字符串存储的,用于定义货币等对精度要求比较高的数据。注意定点数decimal标准定义格式只有decimal(M,D),其他的像float(M,D)是不标准的,在数据库迁移时会出问题。
(3)日期与时间类型
仅仅记录年份用year即可,记录时间time即可,都记录timestamp和datetime都可以,但如果存储较大日期用相对范围大的datetime类型。
但是如果插入记录同时需要记录插入记录时的时间,那么使用timestamp是最方便的。
(4)char与varchar
char存储固定长度字符,varchar存储可变长度字符。Char会自动删除插入数据的尾部空格,varchar不会删除尾部空格。
char采用固定长度,所以它的处理速度比varchar要快,但它的缺点就是浪费空间。所以随存储长度不大,但在检索速度上有要求的数据可以使用char类型,反之可以使用varchar来实现。
对于MyISAM存储引擎,最好使用固定长度的数据代替可变长度,这样可以使整个表静态化,从而使数据检索更快,用空间换时间。
对于InnoDB存储引擎,使用可变长度数据列。因为InnoDB数据表的存储区格式不分固定长度和可变长度,由于varchar按实际长度存储节省空间,所以对磁盘I/O和独具存储总量说比较好。
(5)enum和set
enum只能取单值,他的数据列是一个枚举集合。它的合法取值列表最多允许有65535个成员。因此,在需要从多个值中选取一个时,可以使用enum。例如性别字段适合定义为enum类型。
Set可以取多个值。它的合法取值列表最多允许有64个成员。空字符串可是一个合法的set值。在需要取多个值时适合使用set类型。如一个人的兴趣爱好。
Enum和set的值是以字符串的形式出现的,但在内部,MySQL以数值的形式存储它们。
(6)blob和text
blob是二进制字符串,text是非二进制字符串,两者均可存放大量的信息。Blob主要存储图片、音频信息等,而text只能存储纯文本文件。
MySQL数据库索引学习总结:
l 普通索引 允许在定义索引的列插入重复值和空值
l 唯一索引 定义索引的列值必须唯一,不能重复,但可以为空
l 单列索引 索引只包含单个列,一个表可以有多个单列索引
l 组合索引 索引包含多个列,以最左边为准,查询中必须出现最左边列字段
l 全文索引 索引的列上支持全文查找,允许有重复值和空值,可以在char、varchar或者text类型列上创建。MySQL中只有MyISAM引擎支持全文索引。
l 空间索引 对空间数据类型的字段建立的索引,空间数据类型有:GEOMETRY、POINT、LINESTRING和POLYGON。可以使用SPASTIALA关键字进行扩展,空间索引只能在存储引擎为MyISAM的表中创建。
创建索引原则:
(1)索引并非越多越好
多了站磁盘空间,也影响一些语句执行速度。
(2)避免对经常更新的表做过多索引
对于经常要查询的字段创建索引。
(3)数据量小的表最好不要使用索引
数据量小的时候,遍历数据的时间较短,创建索引与否对查询效率影响不大时,可以不建立索引。
(4)在不同值少的列上不要建立索引
枚举数量少的字段值,可以不建立索引。例如性别字段值只有两个,则无需建立索引。
(5)数据唯一时指定唯一索引
使用唯一索引能保证列的数据完整性。
(6)在频繁进行排序或分组的列上建立组合索引
即在频繁进行group by或 order by的操作时,如果待排列的列有多个,则建立组合索引。
今日任务完成计划:
开始闯关:
1.6从报名贴中找一条最近报名的师弟,用Mysql插入这条数据,并能够根据姓名查出来这条记录
先不对表Student设置外键,修改表中不符合要求的数据类型,特别是三个表字段create_at和update_at,之前我用的datetime型,要改成bigint型,
然后进行报名信息插入
SQL语句:
use db_task1;
insert into Student values (‘尚小雨’,’ QA12-232’, 750611451,’ QA’,’2018-04-01’,’国家开放大学’,
‘http://www.jnshu.com/daily/53594?dailyType=others&total=7&page=1&uid=19204&sort=0&orderBy=3’,’不想当开发的PM 不是好QA’,’万朋’,’QA10-188’,’知乎’,0000000001,20180328,20180328);
select * from Student;
结果成功:
通过姓名查询信息:
select * from Student where sName=’尚小雨’\G;
结果如下:
1.7分别从Navicat和sql语句去将本条记录的报名宣言改成老大最帅。
SQL语句:
update Student set swear='老大最帅' where ID=1;
select * from Student where ID=1\G;
结果如下:
Navicat更新数据:
1.8将表导出成Sql文件,并使用Navicat和SQL分别尝试删除此条数据,并用之前备份的Sql恢复。
1.8.1使用Navicat备份表
(1)右击表选择导出向导,勾选SQL脚本文件,下一步:
(2)选择导出路径,下一步:
(3)选全部栏位,下一步:
(4)包含列标题,下一步:
(5)开始导出:
(6)导出成功,关闭:
(7)查看导出文件:
1.8.2SQL语句删除此条数据
SQL语句:
delete from Student where sId=’QA12-232’;
执行结果删除成功,如下:
1.8.3Navicat删除此条数据
(1)在准备删除的记录上右击选择删除记录:
(2)删除一条记录:
(3)删除成功,这条记录为空:
1.8.4用之前导出保存的SQL文件恢复该条记录
(1)在表上右击 选则运行SQL文件,选中保存SQL文件,点开始:
(2)恢复成功:
1.9给姓名建索引,思考一下还应该给哪些数据建索引
我分别给一下字段进行了索引:
l sName:普通索引 索引名nidx;
l sId:主键 唯一索引 索引名pk;
l tId:外键 唯一索引 索引名fk;
l ID:唯一索引 自增 索引名uidx;
1.10插入10条数据,查看有索引和无索引的情况下,SQL语句执行的效率
有索引情况下SQL一次插入10行:
耗时:0.07秒
无索引情况下:删除索引后重试:
耗时:0.10秒
结论:有索引可以提高执行效率
1.11查看深度思考中Mysql相关的一些问题,将自己思考的结果写在日报中,并查阅之前师兄的日报,看看是否有合自己思路接近或者是完全不一致的地方。
疑问1:创建表时每个字段类型定了之后,使用默认长度还是自定义长度?
思考:目前用默认长度,等后面学习了数据优化的时候,再在根据情况使用自定义长度,因为目前解除的数据列不是很庞大。
疑问2:create_at和update_at为什么不用datetime或timestamp型而要用long
思考:我之前不知道long型就是对应MySQL的bigint型,这个是看了师兄的日报以后才知道的,我就改过来了。之所以用long型我觉得是为了在以后创建和更新数据记录时更好的获取当前时间戳,因为只有long型数据才能保存以毫秒记录的时间。
疑问3:外键的设置要求是什么?
思考:外键是表中的一个字段,它不是本表的主键,但对应另外一个表的主键,一个表可以有一个或多个外键,多个外键字段名称不能相同。外键用来在两个表之间建立连接,它可以是一列或多列。
外键对应的是参照完整性,一个表的外键可以是空值,如果不为空值,怎每一个外键值必须等于另一个表中主键的某个值。
今日收获:
熟悉MySQL数据类型和索引。
掌握MySQL数据库表数据记录的插入与删除。
明日计划:
学习Maven3相关知识,学会下载配置。
完成任务1.12到1.17内容。
学习DAO设计模式。
遇到问题:
对MySQL插入10行数据的时候用时比较长,原因是不细心把一个英文逗号写成了中文逗号,下次遇到插入多条记录时可以将SQL语句粘贴到开发工具中,进行整理对比,还有免费的MySQL凸性管理工具吗?
数据库引擎的特点,以及图片视频等的数据存储特点?
评论