MySQL最新最全面试题和答案_第1页
MySQL最新最全面试题和答案_第2页
MySQL最新最全面试题和答案_第3页
MySQL最新最全面试题和答案_第4页
MySQL最新最全面试题和答案_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、MYSQ皮持事务吗?在缺省模式下,MYSQ是autocommit模式的,所有的数据库更新操作都会即时提交,所以在缺省情况下, mysql 是不支持事务的。但是如果你的 MYSQL1类型是使用InnoDB Tables或BDB tables的话,你的MYSQ就可以使用事务处理,使用SETAUTOCOMMIT=0可以使MYSQ丘许 在非 autocommit 模式,在非autocommit模式下,你必须使用COMMI球提交你的更改,或者用ROLLBACK回滚你的更改。示例如下:START TRANSACTION;SELECT A:=SUM(salary) FROM table1 WHERE typ

2、e=1;UPDATE table2 SET summmary=A WHERE type=1;COMMIT;MYSQ相比于其他数据库有哪些特点?MySQ是一个小型关系型数据库管理系统,开发者为瑞典MySQIAB公司,现在已经被Sun公司收购,支持 FreeBSD Linux、MAC Windows等多种操作系统与其他的大型数据库例如 Oracle 、 DB2、 SQL Server 等相比功能稍弱一些1、可以处理拥有上千万条记录的大型数据2、支持常见的SQL句规范3、可移植行高,安装简单小巧4、良好的运行效率,有丰富信息的网络支持5、调试、管理,优化简单(相对其他大型数据库)介绍一下 mysql

3、 的日期和时间函数这里是一个使用日期函数的例子。 下面的查询选择所有date_col 值在最后30 天内的记录。mysql SELECT something FROM tbl_nameWHERE TO_DAYS(NOW () TO_DAYS(date_col) SELECT DAYOFWEEK(998-02-03 ); 3WEEKDAY(date)返回 date 的星期索引(0 = Monday, 1 = Tuesday, 6 = Sunday):mysql SELECT WEEKDAY(1998-02-03 22:23:00 ); 1mysql SELECT WEEKDAY(1997-11-

4、05 ); 2DAYOFMONTH(date)返回 date 是一月中的第几天,范围为 1 到 31 :mysql SELECT DAYOFMONTM998-02-03 );DAYOFYEAR(date)返回 date 是一年中的第几天,范围为 1 到 366 :mysql SELECT DAYOFYEAR(1998-02-03 ); 34MONTH(date)返回 date 中的月份,范围为 1 到 12 :mysql SELECT MONTH(1998-02-03 z ); 2DAYNAME(date)返回 date 的星期名:mysql SELECT DAYNAMIE(1998-02-0

5、5 ); Thursday MONTHNAME(date)返回 date 的月份名:mysql SELECT MONTHNAME(998-02-05 ); February QUARTER(date)返回 date 在一年中的季度,范围为 1 到 4 :mysql SELECT QUARTER(98-04-01 ); 2WEEK(date)WEEK(date,first)对于星期日是一周中的第一天的场合,如果函数只有一个参数调用,返回date 为一年的第几周,返回值范围为 0 到 53 ( 是的,可能有第 53 周的开始 ) 。两个参数形式的 WEEK() 允许你指定一周是否以星期日或星期一开

6、 mysql SELECT WEEK( 2000-01-01 ,2);始,以及返回值为 0-53 还是 1-52这里的一个表显示第二个参数是如何工作的: 值 含义一周以星期日开始,返回值范围为0-53一周以星期一开始,返回值范围为0-53一周以星期日开始,返回值范围为1-53一周以星期一开始,返回值范围为1-53 (ISO 8601)mysql SELECT WEEK( 1998-02-20); 7mysql SELECT WEEK( 1998-02-20 ,0); 7mysql SELECT WEEK( 1998-02-20 ,1); 8mysql SELECT WEEK( 1998-12-

7、31 ,1); 53注意,在版本4.0 中, WEEK(#,0) 被更改为匹配USA 历法。 注意,如果一周是上一年的最后一周,当你没有使用 2 或 3 做为可选参数时, MySQL将返回 0 :mysql SELECT YEAR( 2000-01-01 ), WEEK( 2000-01-01 ,0);- 2000, 0- 52你可能会争辩说,当给定的日期值实际上是1999 年的第 52 周的一部分时,MySQLX寸WEEK()函数应该返回52。我们决定返回0 ,是因为我们希望该函数返回“在指定年份中是第几周” 。当与其它的提取日期值中的月日值的函数结合使用时,这使得 WEEK() 函数的用法

8、可靠。如果你更希望能得到恰当的年- 周值,那么你应该使用参数2 或 3 做为可选参数,或者使用函数 YEARWEEK():mysql SELECT YEARWEEK2000-01-01 ); 199952mysql SELECT MID(YEARWEEK2000-01-01 ),5,2); 52YEAR(date)返回 date 的年份,范围为 1000 到 9999 :mysql SELECT YEAR( 98-02-03); 1998YEARWEEK(date)YEARWEEK(date,first)返回一个日期值是的哪一年的哪一周。第二个参数的形式与作用完全与WEEK() 的第二个参数一

9、致。注意,对于给定的日期参数是一年的第一周或最后一周的,返回的年份值可能与日期参数给出的年份不一致:mysql SELECT YEARWEEK(1987-01-01 );- 198653注意,对于可选参数0 或 1 ,周值的返回值不同于(0) , WEEK() 根据给定的年语境返回周值。HOUR(time)返回 time 的小时值,范围为 0 到 23 :mysql SELECT HOUR( 10:05:03 ); 10MINUTE(time)返回 time 的分钟值,范围为 0 到 59 :mysql SELECT MINUTE( 98-02-03 10:05:03 ); 5SECOND(t

10、ime)返回 time 的秒值,范围为 0 到 59 :mysql SELECT SECOND(10:05:03 ); 3PERIOD_ADD(P,N)增加N 个月到时期 P(格式为YYMM或YYYYM附值。 注意,期间参数P 不是 一个日期值:mysql SELECT PERIOD_ADD(9801,2); 199803WEEK() 函数所返回值以YYYYMMl#式返回PERIOD_DIFF(P1,P2)返回时期P1和P2之间的月数。P1和P2应该以YYMM或YYYYM附旨定注意,时期参数P1 和 P2 不是 日期值:mysql SELECT PERIOD_DIFF(9802,199703)

11、; 11DATE_ADD(date,INTERVAL expr type) DATE_SUB(date,INTERVAL expr type) ADDDATE(date,INTERVAL expr type) SUBDATE(date,INTERVAL expr type) 这 些 函 数执 行 日 期 的 算术 运算 。 ADDDATE() 和 SUBDATE() 分 别 是 DATE_ADD()和DATE_SUB()的同义词。在MySQL3.23中,如果表达式的 右边是一个日期值或一个日期时间型字段,你可以使用+和-代替DATE_ADD()和 DATE_SUB()(示例如下)。 参数 da

12、te 是一个 DATETIME 或 DATE值,指定一个日期的开始。expr是一个表达式,指定从开始日期上增 加还是减去间隔值。 expr 是一个字符串;它可以以一个“ - ” 领头表示一个负的间隔值。 type 是一个关键词,它标志着表达式以何格式被解释。 下 表显示 type 和 expr 参数是如何关联的: type 值 expr 期望的格式 SECOND SECONDS MINUTE MINUTES HOUR HOURSDAY DAYSMONTH MONTHSYEAR YEARSMINUTE_SECON“DMINUTES:SECON”DSHOURMINUT“E HOURS:MINUT”

13、ESDAY_HOU “R DAYS HOUR” SYEAR_MONT“HYEARS- MONTH” SHOUR_SECON“DHOURS:MINUTES:SECO”NDSDAY_MINUTE“ DAYS HOURS:MINUT” ESDAY_SECON“DDAYS HOURS:MINUTES:SECO” NDS在expr的格式中,MySQL允许任何字符作为定界符。表中所显示的是建议的定界字符。如果date 参数是一个DATE 值,并且计算的间隔仅仅有YEAR MONT环口 DAY部分(没有时间部分),那么返回值也是一个 DATE值否则返回值是一个 DATETIME值:mysql SELECT

14、“1997-12-31 23:59:59 + INTERVAL 1 SECOND; 1998-01-01 00:00:00mysql SELECT INTERVAL 1 DAY + “ 1997-12-31 ; 1998-01-01mysql SELECT “1998-01-01 - INTERVAL 1 SECOND; 1997-12-31 23:59:59mysql SELECT DATE_ADO(1997-12-31 23:59:59 , INTERVAL 1 SECOND); 1998-01-01 00:00:00mysql SELECT DATE_ADO(1997-12-31 23:

15、59:59 , INTERVAL 1 DAY); 1998-01-01 23:59:59mysql SELECT DATE_ADO(1997-12-31 23:59:59 , INTERVAL 1:1 MINUTE_SECOND); 1998-01-01 00:01:00mysql SELECT DATE_SUB(1998-01-01 00:00:00 , INTERVAL 1 1:1:1 DAY_SECOND); 1997-12-30 22:58:59mysql SELECT DATE_ADO(1998-01-01 00:00:00 , INTERVAL -1 10 DAY_HOUR); 1

16、997-12-30 14:00:00mysql SELECT DATE_SUB(1998-01-02 , INTERVAL 31 DAY); 1997-12-02如果你指定了一个太短的间隔值( 没有包括 type 关键词所期望的所有间隔部分),MySQL假设你遗漏了间隔值的最左边部分。例如,如果指定一个type 为DAY_SECON哪么expr值被期望包含天、小时、分钟和秒部分。如果 你象1:10样指定一个值,MySQL设天和小时部分被遗漏了,指定的 值代表分钟和秒。换句话说,”1:10 DAY_SECOND解释为等价于“1:10 MINUTE_SECOND类似于MySQL解释TIME值为经过

17、的时间而不是一天的 时刻。注意,如果依着包含一个时间部分的间隔增加或减少一个日期值,该日期值将被自动地转换到一个日期时间值:mysql SELECT DATE_ADO(1999-01-01 , INTERVAL 1 DAY);- 1999-01-02, INTERVAL 1 HOUR);mysql SELECT DATE_ADO (1999-01-01 1999-01-01 01:00:00如果你使用了确定不正确的日期,返回结果将是NULL。如果你增加MONTHYEAR_MONTH YEAR并且结果日期的天比新月份的最大天数还大,那么它将被调整到新月份的最大天数:mysql SELECT DA

18、TE_ADD(1998-01-30 , INTERVAL 1 MONTH); 1998-02-28注意,上面的例子中,单词INTERVAL和关键词type是不区分字母大小写的。EXTRACT(type FROM date)EXTRACT()函数使用与 DATE_ADD()或DATE_SUB()一致的间隔类型,但是它用于指定从日期中提取的部分,而不是进行日期算术运算。mysql SELECT EXTRACT(YEAR FROMI999-07-02 ); 1999mysql SELECT EXTRACT(YEAR_MONTH FRO999-07-02 01:02:03 ); 199907mysql

19、 SELECT EXTRACT(DAY_MINUTE FROM999-07-02 01:02:03 ); 20102TO_DAYS(date)给出一个日期 date ,返回一个天数(从 0 年开始的天数) :mysql SELECT TO_DAYS(950501); 728779 mysql SELECT TO_DAYS( 1997-10-07 );- 729669TO_DAYS()无意于使用先于格里高里历法(即现行的阳历)(1582)出现的值,因为它不考虑当历法改变时所遗失的天数。FROM_DAYS(N)给出一个天数N,返回一个DATE值:mysql SELECT FROM_DAYS(729

20、669);-1997-10-07 FROM_DAYS(无意于使用先于格里高里历法(1582)出现的值,因为它不考虑当历法改变时所遗失的天数。DATE_FORMAT(date,format)依照 format 字符串格式化 date 值。 下面的修饰符可被用于 format 字符串中: 修饰符 含义%乂月的名字(January.December)%Wll期的名字(Sunday.Saturday)%D有英文后缀的某月的第几天(0th, 1st, 2nd, 3rd, etc.)%Y 年份,数字的,4 位%y 年份,数字的,2 位%X 周值的年份,星期日是一个星期的第一天,数字的, 4 位,与 %V

21、一同使用%x 周值的年份,星期一是一个星期的第一天,数字的, 4 位,与 %v 一 同使用%a 缩写的星期名 (Sun.Sat)%d 月份中的天数,数字的 (00.31) %e 月份中的天数,数字的 (0.31)%m月,数字的(00.12)%c 月,数字的(0.12)%b 缩写的月份名(Jan.Dec)%j 一年中的天数(001.366)%H 小时(00.23)%k 小时 (0.23)%h 小时(01.12)%I 小时(01.12)%l 小时(1.12)%i 分钟,数字的 (00.59)%r 时间,12 小时(hh:mm:ss APM)%T 时间,24 小时(hh:mm:ss) %S 秒 (0

22、0.59)%s 秒 (00.59) %p AM 或 PM%w一周中的天数(0=Sunday.6=Saturday)%U 星期(00.53),星期日是一个星期的第一天%u 星期(00.53),星期一是一个星期的第一天%V 星期(01.53),星期日是一个星期的第一天。与%X一起使用%v 星期(01.53),星期一是一个星期的第一天。与 %x一起使用%一个字母“ %”所有其它的字符不经过解释,直接复制到结果中:mysql SELECT DATE_FORMAT( 997-10-04 22:23:00 , %W %M %Y;Saturday October 1997 mysql SELECT DATE

23、_FORMAT(997-10-04 22:23:00 ,%H:%i:%S );22:23:00 mysql SELECT DATE_FORMAT( 997-10-04 22:23:00 , %D %y %a %d %m %b %j);4th 97 Sat 04 10 Oct 277mysql SELECT DATE_FORMAT( 997-10-04 22:23:00 , %H %k %I %r %T %S % w);22 22 10 10:23:00 PM 22:23:00 00 6mysql SELECT DATE_FORMAT( 999-01-01 , %X %V );1998 52在M

24、ySQL 3.23中,在格式修饰符前需要字符%。在更早的MySQL版本 中,%是可选的。月份与天修饰符的范围从零开始的原因是,在 MySQL 3.23中,它允许存储不完善的日期值(例如2004-00-00)。TIME_FORMAT(time,format)它的使用方法与上面的 DATE_FORMAT(两数相似,但是format字符串只 包含处理小时、分和秒的那些格式修饰符。使用其它的修饰符会产生一个NULL 值或 0 。CURDATE()CURRENT_DATE以YYYY-MM-DD或YYYYMMD路式返回当前的日期值,返回的格式取决于该函数是用于字符串还是数字语境中:mysql SELECT

25、 CURDATE();1997-12-15 mysql SELECT CURDATE() + 0;CURTIME()CURRENT_TIME以HH:MM:SS或HHMMS略式返回当前的时间值,返回的格式取决于该函数是用于字符串还是数字语境中:mysql SELECT CURTIME();23:50:26 mysql SELECT CURTIME() + 0; 235026NOW()SYSDATE()CURRENT_TIMESTAMP以 YYYY-MM-DD HH:MM:SS或 YYYYMMDDHHMMSS返回当前的日期时间值,返回的格式取决于该函数是用于字符串还是数字语境中:mysql SEL

26、ECT NOW();-1997-12-15 23:50:26 mysql SELECT NOW() + 0;注意,函数NOW() 在每个查询中只计算一次,也就是在查询开始执行时。这就是说,如果在一个单独的查询中多次引用了NOW(),它只会给出值都是一个相同的时间。UNIX_TIMESTAMP()UNIX_TIMESTAMP(date)如果调用时没有参数,以无符号的整数形式返回一个Unix 时间戳 ( 从1970-01-01 00:00:00 GMT开始的秒数)。如果以一个参数 date 调用UNIX_TIMESTAMP()它将返回该参数值从 1970-01-01 00:00:00 GMT 开

27、始经过的秒数值。date可以是一个DATE字符串,一个DATETIME字符串, 一个TIMESTAMP或者以一个 YYMMD或 YYYYMMDD示的本地时间: mysql SELECT UNIX_TIMESTAMP();mysql SELECT UNIX_TIMESTAMP(1997-10-04 22:23:00 );当UNIX_TIMESTAM被用于一个TIMESTAMP列时,函数直接返回一个内部 的时间戳值,而不进行一个隐含地“ string-to-unix-timestamp ” 转换。如果你传递一个超出范围的日期参数给 UNIX_TIMESTAMP(),它将返回0, 但是请注意,MyS

28、QL对其仅仅进行基本的检验(年范围1970-2037 ,月份 01-12,日期01-31)。如果你希望减去UNIX_TIMESTAMP()列,你应该需 要将结果强制转换为一有符号整数。查看章节6.3.5 Cast 函数。FROM_UNIXTIME(unix_timestamp ,format)以 YYYY-MM-DDHH:MM:SS 或 YYYYMMDDHHMMSS;返 回一个 unix_timestamp 参数值,返回值的形式取决于该函数使用于字符串还是数字语境。 如果 format 给出,返回值依 format 字符串被格式。 format 可以包含与DATE_FORMAT()数同样的修饰

29、符。1997-10-04 22:23:00 mysql SELECT FROM_UNIXTIME(UNIX_TIMESTAMP(),%Y %D %M %h:%i:%s %x );1997 23rd December 03:43:30 1997 SEC_TO_TIME(seconds)以HH:MM:SS或HHMMS略式返回参数seconds被转换到时分秒后的值,返回值的形式取决于该函数使用于字符串还是数字语境:mysql SELECT SEC_TO_TIME(2378);00:39:38 mysql SELECT SEC_TO_TIME(2378) + 0; 3938TIME_TO_SEC(ti

30、me)将参数 time 转换为秒数后返回:mysql SELECT TIME_TO_SEC(22:23:00 ); 80580mysql SELECT TIME_TO_SEC(00:39:38 ); 2378如何解决MYSQ数据库中文乱码问题?在数据库安的时候指定字符集如果在安完了以后可以更改以下文件:C:Program FilesMySQLMySQL Server 5.0my.iniServer里的所有的 default-character-set=gbkC:ProgramFilesMySQLMySQL5.0datadepot_developmentdb.optdefault-charact

31、er-set=gbk default-collation=gbk_chinese_ci 建立数据库时候:指定字符集类型CREATE DATABASE haichenCHARACTER SETgbkCOLLATE gbk_chinese_ci ;2. 建表的时候也指定字符集CREATE TABLE student (ID varchar(40) NOT NULL default ”,UserID varchar(40) NOT NULL default ”, ) ENGINE=InnoDB DEFAULT CHARSET=gbk;1。创建数据库的时候:CREATE DATABASE databa

32、seCHARACTER SET utf8 COLLATE utf8_general_ci ;. 建表的时候CREATE TABLE database_user (ID varchar(40) NOT NULL default ”,UserID varchar(40) NOT NULL default ”,) ENGINE=InnoDB DEFAULT CHARSET=utf8;.设置URL的时候如何提高MySql 的安全性?如果MYSQ客户端和服务器端的连接需要跨越并通过不可信任的网络,那么需要使用 ssh 隧道来加密该连接的通信。使用 set password 语句来修改用户的密码,先“ m

33、ysql -u root ”登陆数 据库系统,然后“ mysql update mysql.user set password=password( newpwd ) ” ,最后执行“flush privileges ”就可以了。Mysql 需要提防的攻击有,防偷听、篡改、回放、拒绝服务等,不涉及可用性和容错方面。对所有的连接、查询、其他操作使用基于 acl 即访问控制列表的安全措施来完成。也有一些对ssl 连接的支持。设置除了 root 用户外的其他任何用户不允许访问 mysql 主数据库中的 user 表;加密后存放在user 表中的加密后的用户密码一旦泄露,其他人可以随意用该用户名 / 密

34、码相应的数据库;使用 grant 和 revoke 语句来进行用户访问控制的工作 ;不要使用明文密码,而是使用md5()和sha1()等单向的哈系函数来设置密 码;不要选用字典中的字来做密码;采用防火墙可以去掉50%的外部危险,让数据库系统躲在防火墙后面工作,或放置在dmz区域中;从因特网上用nmap来扫描3306端口,也可用telnet server_host 3306不允许从非信任网络中访问数据库服务器的 3306 号 tcp 端口,需要在防火墙或路由器上做设定;为了防止被恶意传入非法参数,例如 where id=234 ,别人却输入whereid=234 or 1=1导致全部显示,所以在

35、web的表单中使用或来用字符串,在动态 url 中加入%22代表双引号、%23代表井号、%27代表单引号; 传递未检查过的值给mysql 数据库是非常危险的 ;在传递数据给mysql 时检查一下大小 ;应用程序需要连接到数据库应该使用一般的用户帐号,开放少数必要的权限给该用户 ;$page_devide$在各编程接口 (c c+ php perl java jdbc 等) 中使用特定逃脱字符函数 ;在因特网上使用 mysql 数据库时一定少用传输明文的数据,而用 ssl 和 ssh的加密方式数据来传输;学会使用 tcpdump 和 strings 工具来查看传输数据的安全性,例如tcpdump

36、 -l -i eth0 -w -src or dst port 3306 strings 。以普通用户来启动 mysql 数据库服务;不使用到表的联结符号,选用的参数 -skip-symbolic-links;确信在 mysql 目录中只有启动数据库服务的用户才可以对文件有读和写的权限 ;不 许 将 process 或 super 权 限 付 给 非 管 理 用 户 , 该 mysqladminprocesslist 可以列举出当前执行的查询文本;super 权限可用于切断客户端连接、改变服务器运行参数状态、控制拷贝复制数据库的服务器file 权限不付给管理员以外的用户, 防止出现 load

37、data /etc/passwd 到表中再用 select 显示出来的问题 ;如果不相信dns 服务公司的服务, 可以在主机名称允许表中只设置ip 数字地址 ;使用 max_user_connections 变量来使 mysqld 服务进程,对一个指定帐户限定连接数;grant 语句也支持资源控制选项 ;启动mysqld服务进程的安全选项开关,-local-infile=0 或1若是0 则客户端程序就无法使用 local load data 了,赋权的一个例子grantinsert(user) on mysql.user to user_name host_name;若使用一skip-gran

38、t-tables 系统将对任何用户的访问不做任何访问控制,但可以用 mysqladmin flush-privileges 或 mysqladmin reload 来开启访问控制 ; 默认 情况是 show databases 语句对所有用户开放,可以用- skip-show-databases 来关闭掉。碰到 error 1045(28000) access denied for user root localhost (using password:no)错误时,你需要重新设置密码,具体方法是 :先用- skip-grant-tables 参 数 启 动 mysqld , 然 后 执 行

39、mysql -u root mysql,mysqlupdate user set password=password( newpassword ) where user= root ;mysqlflush privileges; ,最后重新启动 mysql 就可以了。MySQL试题1、MySQlM得当前时间的函数是?,格式化日期的函数是2、写出SQL语句的格式:插入,更新,删除表名 UserName Tel Content Date2006-10-112006-10-152006-10-152007-05-06)请用SQL语句新增至表中请用 sql 语句把张三的时间更新成为当前系统时间请写出删

40、除名为张四的全部记录3、 请写出数据类型(int char varchar datetime text) 的意思 ; 请问 varchar和 char 有什么区别4、MySQL1增类型(通常为表ID字段)必需将其设为 字段5、以下请用PHPMYADMN(一)创建新闻发布系统,表名为 message有如下字段id 文章 idtitle 文章标题content 文章内容category_id 文章分类 idhits 点击量(二)同样上述新闻发布系统:表 comments录用户回复内容,字段如下comment_id 回复 id id 文章id ,关联message表中的id comment_cont

41、ent 回复内容现通过查询数据库需要得到以下格式的文章标题列表, 并按照回复数量排序,回复最高的排在最前面文章 id 文章标题 点击量 回复数量用一个SQL句完成上述查询,如果文章没有回复则回复数量显示为0( 三 ) 上述内容管理系统,表category 保存分类信息,字段如下category_id int(4) not null auto_increment;categroy_name varchar(40) not null;用户输入文章时,通过选择下拉菜单选定文章分类写出如何实现这个下拉菜单MYSQ面试题:H一个高级MySql面试题Explain MySQIarchitecture. T

42、he front layer takes care of networkconnections and security authentications, the middle layer does the SQL query parsing, and then the query is handled off to the storage engine. A storage engine could be either a default one supplied with MySQL (MyISAM) or a commercial one supplied by a third-part

43、y vendor (ScaleDB, InnoDB, etc.)Explain MySQL locks. - Table-level locks allow the user to lockthe entire table, level locks allow locking of certain portions of the tables (those portions are referred to as tables), row-level locks are the most granular and allow locking of specific rows.Explain mu

44、lti-version concurrency control in MySQL.- Each rowcreation time andhas two additional columns associated with it deletion time, but instead of storing timestamps, MySQLstores version numbers.What are MySQLtransactions? A set of instructions/queries that should be executed or rolled back as a single

45、 atomic unit.What s ACID? Automicity transactions are atomic and should be treated as one in case of rollback. Consistency- the databaseshould be in consistent state between multiple states in transaction. Isolation no other queries can access the data modified by a running transaction. Durability s

46、ystem crashes should not lose the data.Which storage engines support transactions in MySQL? - Berkeley DB and InnoDB.How do you convert to a different table type? ALTER TABLEcustomers TYPE = InnoDBHowdo you index just the first four bytes of the column? ALTER TABLE customers ADD INDEX (business_name

47、(4)What s the difference between PRIMARY KEY and UNIQUE in MyISAM?-PRIMARKEYcannot be null, so essentially PRIMARYKEYis equivalent to UNIQUE NOT NULL.How do you prevent MySQL from caching a query? - SELECT SQL_NO_CACHEWhat s the difference between query_cache_type 1 and 2?- The second one is on- dem

48、and and can be retrieved via SELECT SQL_CACHEIf you re worried about the SQL portability to other servers, youcan use SELECT/* SQL_CACH*E id FROM-MySQLwill interpret the code inside comments, while other servers will ignore it.MYSQ面试题:简单叙述一下MYSQ的优化数据库的设计尽量把数据库设计的更小的占磁盘空间 . 尽可能使用更小的整数类型.(mediumint 就比

49、 int 更合适 ). 尽可能的定义字段为 not null, 除非这个字段需要null. 如果没有用到变长字段的话比如 varchar, 那就采用固定大小的纪录格式比如 char. 表的主索引应该尽可能的短. 这样的话每条纪录都有名字标志且更高效. 只创建确实需要的索引。索引有利于检索记录,但是不利于快速保存记录。如果总是要在表的组合字段上做搜索,那么就在这些字段上创建索引。索引的第一部分必须是最常使用的字段. 如果总是需要用到很多字段,首先就应该多复制这些字段,使索引更好的压缩。. 所有数据都得在保存到数据库前进行处理。. 所有字段都得有默认值。. 在某些情况下, 把一个频繁扫描的表分成两

50、个速度会快好多。 在对动态格式表扫描以取得相关记录时, 它可能使用更小的静态格式表的情况下更是如此。系统的用途. 尽量使用长连接.explain 复杂的SQL语句。. 如果两个关联表要做比较话,做比较的字段必须类型和长度都一致.LIMIT 语句尽量要跟 order by 或者 distinct. 这样可以避免做一次 full table scan. 如果想要清空表的所有纪录 , 建议用 truncate table tablename 而 不是 delete from tablename. 能使用 STORE PROCEDURE 或者 USER FUNCTION 的时候 . 在一条 inser

51、t 语句中采用多重纪录插入格式 . 而且使用 load data infile 来导入大量数据,这比单纯的 indert 快好多 . 经常 OPTIMIZE TABLE 来整理碎片 . 还有就是date 类型的数据如果频繁要做比较的话尽量保存在unsigned int 类型比较快。系统的瓶颈. 磁盘搜索.并行搜索 , 把数据分开存放到多个磁盘中,这样能加快搜索时间 . 磁盘读写(IO)可以从多个媒介中并行的读取数据。.CPU 周期数据存放在主内存中.这样就得增加CPU1勺个数来处理这些数据。. 内存带宽当CPLM将更多的数据存放到CPU勺缓存中来的话,内存的带宽就成了瓶颈.介绍一下如何优化My

52、Sql一、在编译时优化MySQL如果你从源代码分发安装 MySQL要注意,编译过程对以后的目标程序性能有重要的影响,不同的编译方式可能得到类似的目标文件,但性能可能相差很大,因此,在编译安装MySQ适应仔细根据你的应用类型选择最可能好的编译选项。这种定制的MySQ回以为你的应用提供最佳性能。技巧: 选用较好的编译器和较好的编译器选项, 这样应用可提高性能10-30%。(MySQ戊档如是说)、使用 pgcc (Pentium GCC)编译器、仅使用你想使用的字符集编译MySQLMySQ目前提供多达24种不同的字符集,为全球用户以他们自己的语言插入或查看表中的数据。却省情况下,MySQ改装所有者这

53、些字符集,热然而,最好的选择是指选择一种你需要的。如,禁止除Latin1 字符集以外的所有其它字符集:%./configure-with-extra-charsets=none-other-configuration-options、将 mysqld 编译成静态执行文件将 mysqld 编译成静态执行文件而无需共享库也能获得更好的性能。通过在配置时指定下列选项,可静态编译mysqld 。%./configure-with-mysqld-ldflags=-all-static-other-configuration-options、配置样本下列配置命令常用于提高性能:%CFLAG”S=-O6-m

54、pentiumpro -fomit-frame- pointer ” CXX=gccCXXFLAGS” =-O6-mpentiumpro-fomit-frame-pointer-felide-constructors -fno-exceptions -fno- rtti ” ./confi gureprefix=/usr/localenable-assembler-with-mysqld-ldflags=-all-static- disable-shared二、调整服务器确保运用正确的编译固然重要,但这只是成功的第一步,配置众多的 MySQL变量同样对服务器的正常运行起关键作用。 你可以将这些

55、变量的赋值存在一个配置文件中,以确保它们在每次启动MySQL寸均起作用,这个配置文件就是 f 文件。MySQL 已 经 提 供 了 几 个 f 文 件 的 样 本 , 可 在/usr/local/mysqld/share/mysql/ 目录下找到。这些文件分别命名为 my-f 、 my-f 、 my-f 和 my-f ,规模说明可在描述配置文件适用的系统类型标题中找到。 如果在只有相当少内存的系统 上运行MySQL而且只是偶尔的用一下,那么my-f会比较理想,因 为它命令 mysqld 只使用最少的资源。类似地,如果你计划构建电子商务超市,而且系统拥有2G 内存,那么你可能要用到 mysql-

56、f 文件了。为了利用这些文件中的一个,你需要复制一个最适合需求的文件,改名为f 。你可以选择使用配置文件三种作用范围的一种:Global :将 f 文件复制到服务器的 /etc 目录下,这使得配置文件中的变量作用于全局,即对所有服务器上的MySQ散据库服务器有效。Local :将 f 文件复制到 MYSQL-INSTALL-DIR/var/ 目录下,使得f作用于特定的服务器。MYSQL-INSTALL-DIR表示MySQ改装目录。User :你可以再限制作用于特定的用户,将f 复制到用户的根目录下。究竟如何设置f 中的这些变量呢?更进一步说,你可以设置哪一个变量。虽然所用变量对MySQI务器相

57、对通用,每一个变量与 MySQL勺的某些组件有更特定的关系。如变量max_connects 归在 mysqld 类别下。执行下列命令即可知道:%/usr/local/mysql/libexec/mysqld - help它显示大量的选项及与mysqld 相关的变量。你可以很容易地在该行文字之下找出变量:Possible variables for option set-variable (-O) are然后你可以如下设置f 中的那些变量:set-variable = maxconnections=100它设置MySQL!艮务器的最大并发连接数为100。要确保在f文件中的 mysqld 标题下插

58、入变量设置。三、表类型很多MySQLffl户可能很惊讶,MySQ聪实为用户提供5种不同的表类型,称为DBD HEAP ISAM MERGE口 MylASM DBD0为事务安全类,而其他为非 事务安全类。、事务安全DBD、非事务安全HEAPHEAPS是MySQ中存取数据最快的表。这是因为他们使用存储在动态内存中 的一个哈希索引。另一个要点是如果 MySQ或服务器崩溃,数据将丢失。ISAMISAM表是早期MySQ版本的缺省表类型,直到 MylASMFF发出来。建议不要 再使用它。MERGEMERGE一个有趣的新类型,在之后出现。一个 MERGE实际上是一个相同 MylSAMg的集合,合并成一个表,

59、主要是为了效率原因。这样可以提高速度、 搜索效率、修复效率并节省磁盘空间。MyIASM这是MySQL勺缺省表类型。它基于IASM代码,但有很多有用的扩展。MylASM比较好的原因:MylASM麦小于IASM表,所以使用较少资源。MylASMg在不同的平台上二进制层可移植。更大的键码尺寸,更大的键码上限。、指定表类型你可在创建表时指定表的类型。下例创建一个HEARH:mysqlCREATE TABLE email_addresses TYPE=HEAP (email char(55) NOT NULL,name char(30) NOT NULL,PRIMARY KEY(email) );3.4

60、 、更多的表类型为了使MySQLT理工作更有趣,即将发布的 MySQI4.0将提供两种新的表类型,称为 Innobase 和 Gemeni4、优化工具MySQI务器本身提供了几条内置命令用于帮助优化。、 SHOW你可能有兴趣知道MySQI务器究竟更了什么,下列命令给出一个总结:mysqlshow status;它给出了一个相当长的状态变量及其值的列表。 有些变量包含了异常终止客户的数量、异常终止连接的数量、连接尝试的次数、最大并发连接数和大量其他有用的信息。这些信息对找出系统问题和低效极具价值。SHO处能做更多的事情。它可以显示关于日志文件、特定数据库、表、索弓I、 进程和权限表中有价值的信息

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论