Java面试经典题目五(MySQL基础知识)

MySQL数据库部分

【1】MySQL中Where, Group By, Having, Order by执行顺序?

【例子】按由高到低的顺序显示个人平均分在70分以上的学生姓名和平均分,为了尽可能地提高平均分,在计算平均分前不包括分数在60分以下的成绩,并且也不计算小明(xiaoming)的成绩。 分析:

1.要求显示学生姓名和平均分

因此确定第1步select s_name,avg(s_score) from student

2.计算平均分前不包括分数在60分以下的成绩,并且也不计算小明(xiaoming)的成绩

因此确定第2步wheres_score>=60 and s_name!=’xiaoming’

3.显示个人平均分,相同名字的学生(同一个学生)考了多门科目

因此按姓名分组,确定第3步group bys_name

4.显示个人平均分在70分以上

因此确定第4步having avg(s_score)>=70

5.按由高到低的顺序

因此确定第5步order byavg(s_score) desc

完整SQL语句:

select s_name,avg(s_score) from student where s_score>=60 and s_name !='xiaoming' group by s_name having avg(s_score) >=70 order by avg(s_score) desc;

【2】MySQL中myisam与innodb的区别?

答:两种类型最主要的差别就是Innodb 支持事务处理与外键行级锁。而MyISAM不支持.所以MyISAM往往就容易被人认为只适合在小项目中使用。

【3】数据库优化方法

答:1、选取最适用的字段属性,是在可能的情况下,应该尽量把字段设置为NOTNULL;

2.使用连接(JOIN)来代替子查询(Sub-Queries)

3.使用联合(UNION)来代替手动创建的临时表

4.尽管事务是维护数据库完整性的一个非常好的方法,但却因为它的独占性,有时会影响数据库的性能,尤其是在很大的应用系统中。有些情况下我们可以通过锁定表的方法来获得更好的性能。

5.锁定表的方法可以维护数据的完整性,但是它却不能保证数据的关联性。这个时候我们就可以使用外键。

6.使用索引。索引应建立在那些将用于JOIN,WHERE判断和ORDERBY排序的字段上。

7.使用索引可以提高查询的速度,但如果SQL语句使用不恰当的话,索引将无法发挥它应有的作用。

【4】MySQL中索引的原理是什么?

答:[详细参考]

这里设表一共有三列,假设我们以Col1为主键,则图8是一个MyISAM表的主索引(Primary key)示意。可以看出MyISAM的索引文件仅仅保存数据记录的地址。在MyISAM中,主索引和辅助索引(Secondary key)在结构上没有任何区别,只是主索引要求key是唯一的,而辅助索引的key可以重复。如果我们在Col2上建立一个辅助索引,则此索引的结构如下图所示:

同样也是一棵B+Tree,data域保存数据记录的地址。因此,MyISAM中索引检索的算法为首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,则取出其data域的值,然后以data域的值为地址,读取相应数据记录。

MyISAM的索引方式也叫做“非聚集”的,之所以这么称呼是为了与InnoDB的聚集索引区分。

InnoDB索引实现

虽然InnoDB也使用B+Tree作为索引结构,但具体实现方式却与MyISAM截然不同。

第一个重大区别是InnoDB的数据文件本身就是索引文件。从上文知道,MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。而在InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶结点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。

你可能感兴趣的:(Java面试经典题目五(MySQL基础知识))