您好,欢迎访问三七文档
查询数据是否存在用count(*)效率最快,不用其他方法查询语句where后面顺序影响效率范式第一范式(1NF):数据库表中的字段都是单一属性的,不可再分。例如,如下的数据库表是符合第一范式的:字段1字段2字段3字段4而这样的数据库表是不符合第一范式的:字段1字段2字段3字段4字段3.1字段3.2很显然,在当前的任何关系数据库管理系统(DBMS)中,傻瓜也不可能做出不符合第一范式的数据库。第二范式(2NF):数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖(部分函数依赖指的是存在组合关键字中的某些字段决定非关键字段的情况),也即所有非关键字段都完全依赖于任意一组候选关键字。(学号,课程名称)→(姓名,年龄,成绩,学分)这个数据库表不满足第二范式,因为存在如下决定关系:(课程名称)→(学分)(学号)→(姓名,年龄)即存在组合关键字中的字段决定非关键字的情况。由于不符合2NF,这个选课关系表会存在如下问题:(1)数据冗余:同一门课程由n个学生选修,学分就重复n-1次;同一个学生选修了m门课程,姓名和年龄就重复了m-1次。(2)更新异常:若调整了某门课程的学分,数据表中所有行的学分值都要更新,否则会出现同一门课程学分不同的情况。(3)插入异常:假设要开设一门新的课程,暂时还没有人选修。这样,由于还没有学号关键字,课程名称和学分也无法记录入数据库。(4)删除异常:假设一批学生已经完成课程的选修,这些选修记录就应该从数据库表中删除。但是,与此同时,课程名称和学分信息也被删除了。很显然,这也会导致插入异常。把选课关系表SelectCourse改为如下三个表:学生:Student(学号,姓名,年龄);课程:Course(课程名称,学分);选课关系:SelectCourse(学号,课程名称,成绩)。这样的数据库表是符合第二范式的,消除了数据冗余、更新异常、插入异常和删除异常。另外,所有单关键字的数据库表都符合第二范式,因为不可能存在组合关键字。第三范式(3NF):在第二范式的基础上,数据表中如果不存在非关键字段对任一候选关键字段的传递函数依赖则符合第三范式。所谓传递函数依赖,指的是如果存在A→B→C的决定关系,则C传递函数依赖于A。因此,满足第三范式的数据库表应该不存在如下依赖关系:关键字段→非关键字段x→非关键字段y假定学生关系表为Student(学号,姓名,年龄,所在学院,学院地点,学院电话),关键字为单一关键字学号,因为存在如下决定关系:(学号)→(姓名,年龄,所在学院,学院地点,学院电话)这个数据库是符合2NF的,但是不符合3NF,因为存在如下决定关系:(学号)→(所在学院)→(学院地点,学院电话)即存在非关键字段学院地点、学院电话对关键字段学号的传递函数依赖。它也会存在数据冗余、更新异常、插入异常和删除异常的情况,读者可自行分析得知。把学生关系表分为如下两个表:学生:(学号,姓名,年龄,所在学院);学院:(学院,地点,电话)。这样的数据库表是符合第三范式的,消除了数据冗余、更新异常、插入异常和删除异常。鲍依斯-科得范式(BCNF):在第三范式的基础上,数据库表中如果不存在任何字段对任一候选关键字段的传递函数依赖则符合第三范式。假设仓库管理关系表为StorehouseManage(仓库ID,存储物品ID,管理员ID,数量),且有一个管理员只在一个仓库工作;一个仓库可以存储多种物品。这个数据库表中存在如下决定关系:(仓库ID,存储物品ID)→(管理员ID,数量)(管理员ID,存储物品ID)→(仓库ID,数量)所以,(仓库ID,存储物品ID)和(管理员ID,存储物品ID)都是StorehouseManage的候选关键字,表中的唯一非关键字段为“数量”,它是符合第三范式的。但是,由于存在如下决定关系:(仓库ID)→(管理员ID)(管理员ID)→(仓库ID)即存在关键字段决定关键字段的情况,所以其不符合BCNF范式。它会出现如下异常情况:(1)删除异常:当仓库被清空后,所有存储物品ID和数量信息被删除的同时,仓库ID和管理员ID信息也被删除了。(2)插入异常:当仓库没有存储任何物品时,无法给仓库分配管理员。(3)更新异常:如果仓库换了管理员,则表中所有行的管理员ID都要修改。把仓库管理关系表分解为二个关系表:仓库管理:StorehouseManage(仓库ID,管理员ID);仓库:Storehouse(仓库ID,存储物品ID,数量)。这样的数据库表是符合BCNF范式的,消除了删除异常、插入异常和更新异常。mysql日志MySQL有几个不同的日志文件,可以帮助你找出mysqld内部发生的事情:日志文件记入文件中的信息类型错误日志记录启动、运行或停止mysqld时出现的问题。查询日志记录建立的客户端连接和执行的语句。更新日志记录更改数据的语句。不赞成使用该日志。二进制日志记录所有更改数据的语句。还用于复制。慢查询日志记录所有执行时间超过long_query_time秒的所有查询或不使用索引的查询。错误日志log-error=d:/mysql/log/log-error.log二进制日志log-bin=d:/wamp/logs/binbinlog_format=Statement#d:/wamp/logs/bin.000001(包括所有增删改查的记录)general_log=ONgeneral_log_file=d:/wamp/logs/mysql2.logMysqlbinlog日志有三种格式,分别为Statement,MiXED,以及ROW!1.Statement:每一条会修改数据的sql都会记录在binlog中。2.Row:不记录sql语句上下文相关信息,仅保存哪条记录被修改。3.Mixedlevel:是以上两种level的混合使用,一般的语句修改使用statment格式保存binlog,如一些函数,statement无法完成主从复制的操作,则采用row格式保存binlog,MySQL会根据执行的每一条具体的sql语句来区分对待记录的日志形式,也就是在Statement和Row之间选择一种.新版本的MySQL中队rowlevel模式也被做了优化,并不是所有的修改都会以rowlevel来记录,像遇到表结构变更的时候就会以statement模式来记录。至于update或者delete等修改数据的语句,还是会记录所有行的变更。1.RowLevel:5.1.5开始支持。mater记录每行数据的更改日志,slave根据日志逐行应用。优点:数据一致性更有保障。缺点:可能造成日志文件比较大2.StatementLevel:master记录每个执行的query语句以及一些上下文信息,slave节点根据这些信息重新在slave上执行。优点:binarylog比较小。缺点:某些情况下数据一致性难以保障3.MixedLevel:MySQL根据情况选择哪种复制方式。5.1.8开始支持mysql配置参数key_buffer_size:只对MyISAM表起作用,key_buffer_size指定索引缓冲区的大小,它决定索引处理的速度,尤其是索引读的速度。---键高速缓存区大小我分配给mysql的key_buffer_size为1G内存。mysqlsetglobalkey_buffer_size=1024*1024*1024;key_buffer_size(关键参数),索引块用的缓冲区大小,所有的连接程序线程共用key_cache_block_size每一个索引block的大小,默认1024字节---键高速缓存块大小table_cache:指示表高速缓存的大小。当Mysql访问一个表时,如果在Mysql表缓冲区中还有空间,那么这个表就被打开并放入表缓冲区,这样做的好处是可以更快速地访问表中的内容。在mysql默认安装情况下,table_cache的值在2G内存以下的机器中的值默认时256到512,如果机器有4G内存,则默认这个值是2048query_cache_size查询缓存:MySQL服务器可以使用查询缓存来提高那些重复执行的SELECT语句的处理速度。MySQL查询高速缓冲查询缓存存储SELECT查询的文本以及发送给客户端的相应结果。如果随后收到一个相同的查询,服务器从查询缓存中重新得到查询结果,而不再需要解析和执行查询。设置query_cache_size系统变量。设置为0表示禁用查询缓存。默认缓存大小设置为0;也就是禁用查询缓存。当设置query_cache_size变量为非零值时,应记住查询缓存至少大约需要40KB来分配其数据结构。(具体大小取决于系统结构)。如果你把该值设置的太小,将会得到一个警告,如本例所示:mysqlSETGLOBALquery_cache_size=40000;QueryOK,0rowsaffected,1warning(0.00sec)优化优化SELECT语句和其它查询Where条件语句的执行顺序会影响效率Mysql中从左至右执行条件语句,所以要先把结果范围小的放在where后第一个地方数据库查询的结果会放在result中,然后会在内存中保留,所以最好mysql_free_result($result);比较好Char和varchar的区别CHAR:CHAR存储定长数据很方便,CHAR字段上的索引效率级高VARCHAR:存储变长数据,但存储效率没有CHAR高EXPLAIN和DESCINSERT语句的速度加快插入的一些方法:(1)如果同时从同一个客户端插入很多行,使用含多个VALUE的INSERT语句同时插入几行。这比使用单行INSERT语句快(在某些情况下快几倍)。(2)如果你正向一个非空表添加数据,可以调节bulk_insert_buffer_size变量,使数据插入更快。这个参数设置的是bulkinsert的缓存大小,默认是8M。(3)如果你从不同的客户端插入很多行,能通过INSERTDELAYED语句加快速度。(4)用MyISAM,如果在表中没有删除的行,能在SELECT语句正在运行的同时插入行。(5)当从一个文本文件装载一个表时,使用LOADDATAINFILE。这通常比使用很多INSERT语句快20倍。UPDATE语句的速度更新查询的优化同SELECT查询一样,需要额外的写开销。写速度依赖于更新的数据大小和更新的索引的数量。没有更改的索引不被更新。使更改更快的另一个方法是推迟更改然后在一行内进行多次更新。如果锁定表,同时做多个更新比一次做一个快得多。请注意对使用动态记录格式的MyISAM表,更新一个较长总长的记录可能会切分记录。如果经常这样该,偶尔使用OPTIMIZETABLE很重要。DELETE语句的速度删除一个记录的时间与索引数量确切成正比。为了更快速地删除记录,可以增加键高速缓冲的大小。可以使用key_cache_block_size变量为具体的键高速缓冲指定块缓存区的大小。这样允许为索引文件调节I/O操作的性能。优化数据库结构使你的数据尽可能小列索引多列索引MyISAM键高速缓冲,可以使用key_buffer_size系统变量控制键高速缓冲的大小。语言结构用户变量设置用户变量的一个途径是执行SET语句:SET@var_name=expr[,@var_name=expr]...对于SET,可以使用=或:=作为分配符。分配给每个变量的expr可以为整数、实数、字符串或者NULL值。也可以用语句代替SET来为用户变量分配一个值。在这种情况下,分配符必须为:=而不能用=,因为在非SET语句中=被视为一个比较操作符:mysqlSET@t1=0,@t2=0,@t3=0;mysqlSELECT@t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3;注释:在SELECT语句中,表达式发送到客户端后才进行计算。这说明在HAVING、GROUPBY或者ORDERBY子句中,不能使用包含SELECT列表中所设的变量的表达式。mysqlSET@a='test';mysqlSELECT@a,(@
本文标题:面试资料4
链接地址:https://www.777doc.com/doc-1058802 .html