MYSQL数据库设计数据类型选择需要注意哪些地方

MYSQL数据库设计数据类型选择需要注意哪些地方,第1张

•VARCHAR和CHAR类型,varchar是变长的,需要额外的1-2个字节存储,能节约空间,可能会对性能有帮助。但由于是变长,可能发生碎片,如更新数据;

•使用ENUM代替字符串类型,数据实际存储为整型。

•字符串类型

•要尽可能地避免使用字符串来做标识符,因为它们占用了很多空间并且通常比整数类型要慢。特别注意不要在MYISAM表上使用字符串标识符。MYISAM默认情况下为字符串使用了压缩索引(Packed Index),这使查找更为缓慢。据测试,使用了压缩索引的MYISAM表性能要慢6倍。

•还要特别注意完全‘随机’的字符串,例如由MD5()、SHA1()、UUID()产生的。它们产生的每一个新值都会被任意地保存在很大的空间范围内,这会减慢INSERT及一些SELECT查询。1)它们会减慢INSERT查询,因为插入的值会被随机地放入索引中。这会导致分页、随机磁盘访问及聚集存储引擎上的聚集索引碎片。2)它们会减慢SELECT查询,因为逻辑上相邻的行会分布在磁盘和内存中的各个地方。3)随机值导致缓存对所有类型的查询性能都很差,因为它们会使缓存赖以工作的访问局部性失效。如果整个数据集都变得同样“热”的时候,那么把特定部分的数据缓存到内存中就没有任何的优势了。并且如果工作集不能被装入内存中,缓存就会进行很多刷写的工作,并且会导致很多缓存未命中。

•如果保存UUID值,就应该移除其中的短横线,更好的办法是使用UHEX()把UUID值转化为16字节的数字,并把它保存在BINARY(16)列中。

为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则。在关系型数据库中这种规则就称为范式。范式是符合某一种设计要求的总结。要想设计一个结构合理的关系型数据库,必须满足一定的范式。

1第一范式

确保每列保持原子性

列不可分

有主键

根据实际需求来定。比如某些数据库系统中需要用到“地址”这个属性,本来直接将“地址”属性设计成一个数据库表的字段就行。但是如果系统经常会访问“地址”属性中的“城市”部分,那么就非要将“地址”这个属性重新拆分为省份、城市、详细地址等多个部分进行存储,这样在对地址中某一部分 *** 作的时候将非常方便。这样设计才算满足了数据库的第一范式

首先定义三个表,学生(id,sno,name),课程(cid,cname),成绩表(sid,id,cid,score),这样,数据库表基本定义完成,这个是数据库 *** 作的关键,接下来用sql语句给每张表插入数据:例如学生表,id自增长

insert into student(sno,sname) values(学号,学生姓名)

参考一下。

个人的观点,这种大表的优化,不一定上来就要分库分表,因为表一旦被拆分,开发、运维的复杂度会直线上升,而大多数公司是欠缺这种能力的。所以MySQL中几百万甚至小几千万的表,先考虑做单表的优化。

单表优化

单表优化可以从这几个角度出发:

表分区:MySQL在51之后才有的,可以看做是水平拆分,分区表需要在建表的需要加上分区参数,用户需要在建表的时候加上分区参数;分区表底层由多个物理子表组成,但是对于代码来说,分区表是透明的;SQL中的条件中最好能带上分区条件的列,这样可以定位到少量的分区上,否则就会扫描全部分区。

读写分离:最常用的优化手段,写主库读从库;

增加缓存:主要的思想就是减少对数据库的访问,缓存可以在整个架构中的很多地方,比如:数据库本身有就缓存,客户端缓存,数据库访问层对SQL语句的缓存,应用程序内的缓存,第三方缓存(如Redis等);

字段设计:单表不要有太多字段;VARCHAR的长度尽量只分配真正需要的空间;尽量使用TIMESTAMP而非DATETIME;避免使用NULL,可以通过设置默认值解决。

索引优化:索引不是越多越好,针对性地建立索引,索引会加速查询,但是对新增、修改、删除会造成一定的影响;值域很少的字段不适合建索引;尽量不用UNIQUE,不要设置外键,由程序保证;

SQL优化:尽量使用索引,也要保证不要因为错误的写法导致索引失效;比如:避免前导模糊查询,避免隐式转换,避免等号左边做函数运算,in中的元素不宜过多等等;

NoSQL:有一些场景,可以抛弃MySQL等关系型数据库,拥抱NoSQL;比如:统计类、日志类、弱结构化的数据;事务要求低的场景。

表拆分

数据量进一步增大的时候,就不得不考虑表拆分的问题了:

垂直拆分:垂直拆分的意思就是把一个字段较多的表,拆分成多个字段较少的表;上文中也说过单表的字段不宜过多,如果初期的表结构设计的就很好,就不会有垂直拆分的问题了;一般来说,MySQL单表的字段最好不要超过二三十个。

水平拆分:就是我们常说的分库分表了;分表,解决了单表数据过大的问题,但是毕竟还在同一台数据库服务器上,所以IO、CPU、网络方面的压力,并不会得到彻底的缓解,这个可以通过分库来解决。水平拆分优点很明显,可以利用多台数据库服务器的资源,提高了系统的负载能力;缺点是逻辑会变得复杂,跨节点的数据关联性能差,维护难度大(特别是扩容的时候)。

希望我的回答,能够帮助到你!我将持续分享Java开发、架构设计、程序员职业发展等方面的见解。

一、不定项选择题(共40题,每小题25分,总分100分)1数据库管理系统的发展历经了如下那些模型阶段(ACDE)A层次模型B结构模型C关系模型D网状模型E对象模型2关系型数据库的核心单元是(B)A对象B表C行D列3对于关系型数据库来说,表之间存在下面那些关系(ABC)A一对一关系B一对多关系C多对多关系D继承关系4在SQL中,下面对于数据定义语言(DDL)描述正确的是(D)。ADDL关心的是数据库中的数据B完成数据的增、删、改、查 *** 作C控制对数据库的访问D定义数据库的结构5MySQL是一种(C)数据库管理系统。A层次型B网络型C关系型D对象型6SQL中,下列 *** 作有语法错误的是(B)AAGEISNOTNULLBNOT(AGEISNULL)CSNAME=‘王五’DSNAME=‘王%’7SQL中,下列关于创建、管理数据库的 *** 作语句不正确的是(CDE)ACREATEDATABASEInstantBUSEInstantCNEWDATABASEInstantDConnectionInstantEDeleteDATEBASEInstant8在MySQL中,不存在的数据类型是(F)。AINTBTEXTCDECIMALDVARCHAREDATETIMEFVARCHAR29在MySQL中,下列关于创建数据库表的描述正确的是(C)。A在创建表时必须设定列的约束B在删除表的时候通过外键约束连接在一起的表会被一同删除C在创建表时必须设置列类型D通过CREATETABLEnew_tSELECTFROMold_t复制表的同时,表的约束能够一起被复制到新表中10根据数据完整性实施的方法,可以将其分为(ACDF)A实体完整性B表完整性C域完整性D引用完整性E记录完整性F用户自定义完整性11下面关于域完整性的方法,不正确的是(A)。A主键约束B外键约束C检查约束D非空约束E默认值12下面关于创建和管理索引正确的描述是(C)。A创建索引是为了便于全表扫描B索引会加快DELETE、UPDATE和INSERT语句的执行速度C索引被用于快速找到想要的记录D大量使用索引可以提高数据库的整体性能13SQL中,“AGEIN(20,22)”的语义是(D)。AAGE=20BAGE20CAGE=20ANDAGE=22DAGE=20ORAGE=2214有一个关系:学生(学号,姓名,系别),规定学号的值域是8个数字组成的字符串,这一规则属于(C)A实体完整性约束B参照完整性约束C用户自定义完整性约束D关键字完整性约束15下面SQL是来源于考试成绩表t_exam:学号stuId、科目编号subId、成绩score,考试日期:ex_date。有以下sql,它表示的意思是:(B)Selectstu_id,subId,count()asxFromt_examWhereex_date=’2008-08-08’Groupstu_id,subIdHavingcount()>1OrderbyxdescA找出’2008-08-08’这天某科考试2次及以上的学生记录B找出’2008-08-08’这天,某科考试2次及以上的学生记录,考试次数多的放在前面C找出’2008-08-08’这天,某科考试2次及以上的学生记录,考试次数少的放在前面D根据学号和学科分组,找出每个人考试科数,最后考试次数多的放在前面16EMP表如下所示,下面哪些SQL语句的返回值为3:(BD)EMP雇员号雇员名部门号工资 001 张山 02 2000010 王宏达 011200056 马林生 021000101 赵敏04Aselectcount()fromempBselectcount(distinct部门号)fromempCselectcount()fromempgroupby雇员号Dselectcount(工资)fromemp17下面那一项不是SELECT语句对数据的 *** 作:(D)A投影B联接C并D级联18下面关于SQL数据查询 *** 作描述正确的有:(ABD)A投影 *** 作是选择对表中的哪些列进行查询 *** 作B使用DISTINCT关键字可以过滤查询中重复的记录C在模糊查询中,通配符“%”表示匹配单个字符,而“_”表示匹配零个或多个字符D在MySQL中使用LIMIT关键字限制从数据库中返回记录的行数19在SQL语言中,条件“BETWEEN20AND30”表示年龄在20到30之间,且(A)。A包括20岁和30岁B不包括20岁和30岁C包括20岁,不包括30岁D不包括20岁,包括30岁20SQL语言中,删除EMP表中全部数据的命令正确的是(C)。AdeletefromempBdroptableempCtruncatetableempD没有正确答案21有关索引的说法错误的是(AD)A索引的目的是为增加数据 *** 作的速度B索引是数据库内部使用的对象C索引建立得太多,会降低数据增加删除修改速度D只能为一个字段建立索引22下列哪个关键字在Select语句中表示所有列(A)ABALLCDESCDDISTINCT23在表中设置外键实现的是哪一类数据完整性(B)A实体完整性B引用完整性C用户定义的完整性D实体完整性、引用完整性和用户定义的完整性24下面正确表示Employees表中有多少非NULL的Region列的SQL语句是(B)ASELECTcount()fromEmployeesBSELECTcount(ALLRegion)fromEmployeesCSELECTcount(DistinctRegion)fromEmployeesDSELECTsum(ALLRegion)fromEmployees25下面可以通过聚合函数的结果来过滤查询结果集的SQL子句是(C)AWHERE子句BGROUPBY子句CHAVING子句DORDERBY子句26t_score(stu_id,sub_id,score),即成绩表(学号,科目编号,成绩)。学生如果某科没有考试,则该科成绩录入null。能够获取各位学生的平均成绩的选项是(A)Aselectavg(nvl(socre,0))fromscoregroupbystu_idBselectstu_id,avg(sorce)fromscoreCselectstu_id,avg(score)fromscoreDselectstu_id,sum(score)/count(score)fromscore27若要求查找S表中,姓名的第一个字为'王'的学生学号和姓名。下面列出的SQL语句中,哪个是正确的(B)ASELECTSno,SNAMEFROMSWHERESNAME=′王%′BSELECTSno,SNAMEFROMSWHERESNAMELIKE′王%′CSELECTSno,SNAMEFROMSWHERESNAMELIKE′王_′D全部28若要求“查询选修了3门以上课程的学生的学生号”,正确的SQL语句是(B)ASELECTSnoFROMSCGROUPBYSnoWHERECOUNT()>3BSELECTSnoFROMSCGROUPBYSnoHAVING(COUNT()>3)CSELECTSnoFROMSCORDERBYSnoWHERECOUNT()>3DSELECTSnoFROMSCORDERBYSnoHAVINGCOUNT()>=329对下面的查询语句描述正确的是(D)SelectStudentID,Name,(selectcount()fromStudentExamwhereStudentExamStudentID=StudentStudentID)asExamsTakenfromStudentorderbyExamsTakendescA从Student表中查找StudentID和Name,并按照升序排列B从Student表中查找StudentID和Name,并按照降序排列C从Student表中查找StudentID、Name和考试次数D从Student表中查找StudentID、Name,并从StudentExam表中查找与StudentID一致的学生考试次数,并按照降序排列30下面题基于学生-课程数据库中的三个基本表:学生信息表:s(sno,sname,sex,age,dept)主键为sno课程信息表:c(cno,cname,teacher)主键为cno学生选课信息表:sc(sno,cno,grade)主键为(sno,cno)“从学生选课信息表中找出无成绩的学生信息”的SQL语句是(Cd)ASELECTFROMscWHEREgrade=NULLBSELECTFROMscWHEREgradeIS‘’CSELECTFROMscWHEREgradeISNULLDSELECTFROMscWHEREgrade=‘’31当子查询返回多行时,可以采用的解决法是(C)。A使用聚合函数BWhere条件判断C使用IN运算符D使用Groupby进行分组32下面关于在子查询中使用运算符描述不正确的是(D)。A使用IN运算符用于查找字段值属于某一组值的行B使用Exists运算符用于测试子查询是否返回行,如果返回其值就为真C使用ALL运算符用于测试子查询结果集的所有行是否满足指定的条件D使用Any运算符用于测试子查询结果集中的一行或多行不满足指定的条件33下面关于组合查询描述不正确的是(D)。A从一个表中获取的数据必须和其它表中的数据具有相同的列数B两个表中相对应的列必须具有相同的数据类型CUNION的结果集列名与第一个SELECT语句的结果集中的列名相同DUNION的结果集列名与第二个SELECT语句的结果集中的列名相同EUNIONALL运算符返回每个数据集的所有成员34下面关于联接的描述正确的是(A)。A内联接使用比较运算符根据每个表共有的列值来匹配两个表中的行B左外联接结果集包含从右边的表返回的所有行C右外联接结果集包含从左边的表返回的所有行D全外联接返回左表和右表中的所有匹配的行35下面关于数据库设计过程正确的顺序描述是(C)。A需求收集和分析、逻辑设计、物理设计、概念设计B概念设计、需求收集和分析、逻辑设计、物理设计C需求收集和分析、概念设计、逻辑设计、物理设计D需求收集和分析、概念设计、物理设计、逻辑设计36ER图属于下面哪一种数据库设计模型(B)。A物理数据模型B概念数据模型C逻辑数据模型D需求模型37非主键必须完全依赖于主键列,这属于下列范式的内容(BC)A1NFB2NFC3NFD都没有的38如果一个字段的数据必须来源另一个表的主键,那么要在这个字段上建立(B)。APK(主键)BFK(外键)CUK(唯一键)D复合主键39根据三个范式的定义,下面哪个选项的设计是正确的(C)职工编号姓名工种车间车间主任1001李宁车工一车间周杰1002王海铣工一车间周杰1003赵亮钳工二车间吴明1001李宁钳工二车间吴明A员工表、工种表、车间表B员工表、工种表、车间表、车间主任表C员工表、工种表、车间表、员工工种表、员工车间表D以上设计均不正确40下列说法中,哪些是正确的(BD)ARDBMS是数据库管理系统的简称B各行记录都不能重复,是第二范式要求的C在数据库设计中一定要满足第三范式D索引越多,查询越快,数据更新越慢

1、优化设计的技巧

(1) 如果一个字段需要经常更改,则采用以空间换时间的设计方法

最常见的例子是用户积分登录次数的累加,按照范式设计,在users表中建立一个字段us_scores,以后需要在用户积分改变时采用update的语句进行修改。但是知道 update语句的执行速度是很慢的,为了避免大量重复使用它,优化的设计方案是建立us_scores表,存储每次增加的积分,在查询是采用SQL语句的sum方法来计算之。

(2) 关联字段类型尽可能定义为数字类型

(3) 表的序列字段必须是数字类型

(4) 若数据库有移植的可能性,不使用存储过程及触发器

(5) 建立恰当的索引

索引的建立是加快数据库查询的基本技巧之一,通常的建议是,只有百万级的记录的表格才应该建立索引。

,命名都应该作为非常重要的事情来看待,表、序列、字段、索引的命名技巧可以归结如下:

(1) 关联字段名称必须相同,名称以基础表的字段名称为准

(2) 序列名字跟表字段名字相同

(3) 关联表的名称应该是被关联的表用“_”连接起来组成的

(4) 字段定义的前两位是表名的缩写,第三位是下划线

一,保证规范,序列名称必须是唯一的,而且,一般的序列就是这个表的id字段。如果不加前缀,那么字段都叫做id就会违背惟一性原则。

第二,为了将来关联查询语句的书写方便。

(5) 索引的名字和表的名字相同

(6) 常用字段采用固定定义

为了提高大数据量的表格的查询速度,可以采用建立适当的索引方式。如果一个表只有一个索引,建议索引的名字跟表相同,如果有多个索引,则为表名称加下划线加索引列名称。

最安全的设计方案是,Web数据库和测试数据库分离。Web数据库权限只被管理员一个人掌握。

关于MySQL数据库设计

的优化措施还需要经过数据库设计人员的不断发掘,从数据库设计中不断的发现问题,提出解决问题的方法,才能将数据库的性能优化的更好更全面。

以上就是关于MYSQL数据库设计数据类型选择需要注意哪些地方全部的内容,包括:MYSQL数据库设计数据类型选择需要注意哪些地方、以下哪个设计符合表设计规范、mysql设计教学管理数据库:要求设计数据库记录每个同学在每门课程上的成绩,可以自定义场景等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9507065.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存