外键中引⽤列的数⽬与被引⽤列的数⽬不等_企业⾯试中关于MYSQL重点的25道⾯试题解答!...
问题1:char、varchar的区别是什么?
varchar是变长⽽char的长度是固定的。如果你的内容是固定⼤⼩的,你会得到更好的性能。
问题2: TRUNCATE和DELETE的区别是什么?
DELETE命令从⼀个表中删除某⼀⾏,或多⾏,TRUNCATE命令永久地从表中删除每⼀⾏。
问题3:什么是触发器,MySQL中都有哪些触发器?
触发器是指⼀段代码,当触发某个事件时,⾃动执⾏这些代码。在MySQL数据库中有如下六种触发器:
1、Before Insert
2、After Insert
3、Before Update
4、After Update
5、Before Delete
6、After Delete
问题4:FLOAT和DOUBLE的区别是什么?
FLOAT类型数据可以存储⾄多8位⼗进制数,并在内存中占4字节。
DOUBLE类型数据可以存储⾄多18位⼗进制数,并在内存中占8字节。
问题5:如何在MySQL种获取当前⽇期?
SELECT CURRENT_DATE();
问题6:如何查询第n⾼的⼯资?
SELECT DISTINCT(salary) from employee ORDER BY salary DESC LIMIT n-1,1
问题7:请写出下⾯MySQL数据类型表达的意义(int(0)、char(16)、varchar(16)、datetime、text)
int(0)表⽰数据是INT类型,长度是0、char(16)表⽰固定长度字符串,长度为16、varchar(16)表⽰可变长度字符串,长度为16、datetime表⽰时间类型、text表⽰字符串类型,能存储⼤字符串,最多存储65535字节数据)
问题8:请说明InnoDB和MyISAM的区别
InnoDB⽀持事务,MyISAM不⽀持;
InnoDB数据存储在共享表空间,MyISAM数据存储在⽂件中;
InnoDB⽀持⾏级锁,MyISAM只⽀持表锁;
join和in哪个查询更快InnoDB⽀持崩溃后的恢复,MyISAM不⽀持;
InnoDB⽀持外键,MyISAM不⽀持;
InnoDB不⽀持全⽂索引,MyISAM⽀持全⽂索引;
问题9:innodb引擎的特性
插⼊缓冲(insert buffer)
⼆次写(double write)
⾃适应哈希索引(ahi)
预读(read ahead)
问题10:请列举3个以上表引擎
InnoDB、MyISAM、Memory
问题11:请说明varchar和text的区别
varchar可指定字符数,text不能指定,内部存储varchar是存⼊的实际字符数+1个字节(n<=255)或2个字节(n>255),text是实际字符数+2个字节。
text类型不能有默认值。
varchar可直接创建索引,text创建索引要指定前多少个字符。varchar查询速度快于text,在都创建索引的情况下,text的索引⼏乎不起作⽤。
查询text需要创建临时表。
问题11:varchar(50)中50的含义
最多存放50个字符,varchar(50)和(200)存储hello所占空间⼀样,但后者在排序时会消耗更多内存,因为order by col采⽤
fixed_length计算col长度(memory引擎也⼀样)。
问题12:int(20)中20的含义
是指显⽰字符的长度,不影响内部存储,只是当定义了ZEROFILL时,前⾯补多少个 0
问题13:简单描述MySQL中,索引,主键,唯⼀索引,联合索引的区别,对数据库的性能有什么影响?
-⼀个表只能有⼀个主键索引,但是可以有多个唯⼀索引。
主键索引⼀定是唯⼀索引,唯⼀索引不是主键索引。
主键可以与外键构成参照完整性约束,防⽌数据不⼀致。
联合索引:将多个列组合在⼀起创建索引,可以覆盖多个列。(也叫复合索引,组合索引)
外键索引:只有InnoDB类型的表才可以使⽤外键索引,保证数据的⼀致性、完整性、和实现级联操作(基本不⽤)。
全⽂索引:MySQL⾃带的全⽂索引只能⽤于MyISAM,并且只能对英⽂进⾏全⽂检索 (基本不⽤)
问题14:创建MySQL联合索引应该注意什么?
需遵循前缀原则
问题15:列值为NULL时,查询是否会⽤到索引?
在MySQL⾥NULL值的列也是⾛索引的。当然,如果计划对列进⾏索引,就要尽量避免把它设置为可空,MySQL难以优化引⽤了可空列的查询,它会使索引、索引统计和值更加复杂。
问题16:以下语句是否会应⽤索引:SELECT FROM users WHERE YEAR(adddate) <
2019;*
不会,因为只要列涉及到运算,MySQL就不会使⽤索引。
问题17:MyISAM索引实现?
MyISAM存储引擎使⽤B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址。MyISAM的索引⽅式也叫做⾮聚簇索引的,之所
以这么称呼是为了与InnoDB的聚簇索引区分。
问题17:MyISAM索引与InnoDB索引的区别?
InnoDB索引是聚簇索引,MyISAM索引是⾮聚簇索引。
InnoDB的主键索引的叶⼦节点存储着⾏数据,因此主键索引⾮常⾼效。
MyISAM索引的叶⼦节点存储的是⾏数据地址,需要再寻址⼀次才能得到数据。
InnoDB⾮主键索引的叶⼦节点存储的是主键和其他带索引的列数据,因此查询时做到覆盖索引会⾮常⾼效。
问题18:有A(id,sex,par,c1,c2),B(id,age,c1,c2)两张表,其中A.id与B.id关联,现在要求
写出⼀条SQL语句,将B中age>50的记录的c1,c2更新到A表中同⼀记录中的c1,c2字段
中
UPDATE A,B set A.c1 = B.c1, A.c2 = B.c2 WHERE A.id = B.id and B.age > 50;UPDATE A INNER JOIN B ON A.id = B.id set A.c1 = B.c1,A.c2 = B.c2 WHERE
问题19 :MySQL的关联查询语句你会那些?
六种关联查询
交叉连接(CROSS JOIN)
内连接(INNER JOIN)
外连接(LEFT JOIN/RIGHT JOIN)
联合查询(UNION与UNION ALL)
全连接(FULL JOIN)
交叉连接(CROSS JOIN)
SELECT * FROM A,B(,C)或者SELECT * FROM A CROSS JOIN B (CROSS JOIN C)#没有任何关联条件,结果是笛卡尔积,结果集会很⼤,没有意义,很少使⽤内连内连接分为三类
等值连接:ON A.id=B.id
不等值连接:ON A.id > B.id
⾃连接:SELECT * FROM A T1 INNER JOIN A T2 ON T1.id=T2.pid
外连接(LEFT JOIN/RIGHT JOIN)
左外连接:LEFT OUTER JOIN, 以左表为主,先查询出左表,按照ON后的关联条件匹配右表,没有匹配到的⽤NULL填充,可以简写成LEFT JOIN
右外连接:RIGHT OUTER JOIN, 以右表为主,先查询出右表,按照ON后的关联条件匹配左表,没有匹配到的⽤NULL填充,可以简写成RIGHT JOIN
联合查询(UNION与UNION ALL)
SELECT * FROM A UNION SELECT * FROM B UNION ...
就是把多个结果集集中在⼀起,UNION前的结果为基准,需要注意的是联合查询的列数要相等,相同的记录⾏会合并
如果使⽤UNION ALL,不会合并重复的记录⾏
效率 UNION ⾼于 UNION ALL
全连接(FULL JOIN)
MySQL不⽀持全连接
可以使⽤LEFT JOIN 和UNION和RIGHT JOIN联合使⽤
SELECT * FROM A LEFT JOIN B ON A.id=B.id UNIONSELECT * FROM A RIGHT JOIN B ON A.id=B.id
嵌套查询
⽤⼀条SQL语句得结果作为另外⼀条SQL语句得条件,效率不好把握
SELECT * FROM A WHERE id IN (SELECT id FROM B)
解题⽅法
根据考题要搞清楚表的结果和多表之间的关系,根据想要的结果思考使⽤那种关联⽅式,通常把要查询的列先写出来,然后分析这些列都属于哪些表,才考虑使⽤关联查询
问题20:UNION与UNION ALL的区别?
如果使⽤UNION ALL,不会合并重复的记录⾏
效率 UNION ⾼于 UNION ALL
问题20:⼀个6亿的表a,⼀个3亿的表b,通过外键tid关联,你如何最快的查询出满⾜条件的第50000到第50200中的这200条数据记录。
1、如果A表TID是⾃增长,并且是连续的,B表的ID为索引
select * from a,b where a.tid = b.id and a.tid>50000 limit 200;
2、如果A表的TID不是连续的,那么就需要使⽤覆盖索引.TID要么是主键,要么是辅助索引,B表ID也需
要有索引。
select * from b , (select tid from a limit 50000,200) a where b.id = a .tid;
问题21:拷贝表( 拷贝数据, 源表名:a ⽬标表名:b)
insert into b(a, b, c) select d,e,f from a;
问题22: Student(S#,Sname,Sage,Ssex) 学⽣表 Course(C#,Cname,T#) 课程表
SC(S#,C#,score) 成绩表 Teacher(T#,Tname) 教师表查询没学过“叶平”⽼师课的同学的学号、姓名
select Student.S#,Student.Snamefrom Studentwhere S# not in (select distinct( SC.S#) from SC,Course,Teacher where SC.C#=Course.C# and Teacher.T#问题23:随机取出10条数据
SELECT * FROM users WHERE id >= ((SELECT MAX(id) FROM users)-(SELECT MIN(id) FROM users)) * RAND() + (SELECT MIN(id) FROM users) LIMI此
问题24:请简述项⽬中优化SQL语句执⾏效率的⽅法,从哪些⽅⾯,SQL语句性能如
何分析?
考点分析:
这道题主要考察的是查分析SQL语句查询速度慢的⽅法
延伸考点:
优化查询过程中的数据访问
优化长难的查询语句
优化特定类型的查询语句
如何查查询速度慢的原因
记录慢查询⽇志,分析查询⽇志,不要直接打开慢查询⽇志进⾏分析,这样⽐较浪费时间和精⼒,可以使⽤pt-query-digest⼯具进⾏分析
使⽤show profile
set profiling=1;开启,服务器上所有执⾏语句会记录执⾏时间,存到临时表中show profilesshow profile for query 临时表ID
使⽤show status
show status会返回⼀些计数器,show global status会查看所有服务器级别的所有计数
有时根据这些计数,可以推测出哪些操作代价较⾼或者消耗时间多
show processlist
观察是否有⼤量线程处于不正常的状态或特征
最常问的MySQL⾯试题五——每个开发⼈员都应该知道
使⽤explain
分析单条SQL语句
优化查询过程中的数据访问
访问数据太多导致查询性能下降
确定应⽤程序是否在检索⼤量超过需要的数据,可能是太多⾏或列
确认MySQL服务器是否在分析⼤量不必要的数据⾏
避免犯如下SQL语句错误
查询不需要的数据。解决办法:使⽤limit解决
多表关联返回全部列。解决办法:指定列名
总是返回全部列。解决办法:避免使⽤SELECT *
重复查询相同的数据。解决办法:可以缓存数据,下次直接读取缓存
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论