1、innoDB的B+Tree 存储整行数据和主键的值得区别?
1、 整行数据:innoDB的B+Tree存储了整行数据的是主键索引,也被成为聚凑索引。
2、 存储主键的值:成为非主键索引,也被称为非聚凑索引
2、读写分离常见方案?
1、 应用程序根据业务逻辑来判断,增删改等写操作命令发给主库,查询命令发给备库。
2、 利用中间件来做代理,负责对数据库的请求识别出读还是写,并分发到不同的数据库中。(如:amoeba,MySQL-proxy)
3、六种关联查询
1、 交叉连接(CROSS JOIN)
2、 内连接(INNER JOIN)
3、 外连接(LEFT JOIN/RIGHT JOIN)
4、 联合查询(UNION与UNION ALL)
5、 全连接(FULL JOIN)
6、 交叉连接(CROSS JOIN)
SELECT * FROM A,B(,C)或者SELECT * FROM A CROSS JOIN B (CROSS JOIN C)#没有任何关联条件,结果是笛卡尔积,结果集会很大,没有意义,很少使用内连接(INNER JOIN)SELECT * FROM A,B WHERE A.id=B.id或者SELECT * FROM A INNER JOIN B ON A.id=B.id多表中同时符合某种条件的数据记录的集合,INNER JOIN可以缩写为JOIN
内连接分为三类
1、 等值连接:ON A.id=B.id
2、 不等值连接:ON A.id > B.id
3、 自连接: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 ...
1、 就是把多个结果集集中在一起,UNION前的结果为基准,需要注意的是联合查询的列数要相等,相同的记录行会合并
2、 如果使用UNION ALL,不会合并重复的记录行
3、 效率 UNION 高于 UNION ALL
全连接(FULL JOIN)
SELECT * FROM A LEFT JOIN B ON A.id=B.id UNIONSELECT * FROM A RIGHT JOIN B ON A.id=B.id
MySQL不支持全连接
可以使用LEFT JOIN 和UNION和RIGHT JOIN联合使用
有2张表
1张R、1张S,R表有ABC三列,S表有CD两列,表中各有三条记录
R表
A | B | C |
---|---|---|
a1 | b1 | c1 |
a2 | b2 | c2 |
a3 | b3 | c3 |
S表
C | D |
---|---|
c1 | d1 |
c2 | d2 |
c4 | d3 |
交叉连接(笛卡尔积)
SQL
select r.*,s.* from r,s
结果
A | B | C | C | D |
---|---|---|---|---|
a1 | b1 | c1 | c1 | d1 |
a2 | b2 | c2 | c1 | d1 |
a3 | b3 | c3 | c1 | d1 |
a1 | b1 | c1 | c2 | d2 |
a2 | b2 | c2 | c2 | d2 |
a3 | b3 | c3 | c2 | d2 |
a1 | b1 | c1 | c4 | d3 |
a2 | b2 | c2 | c4 | d3 |
a3 | b3 | c3 | c4 | d3 |
内连接结果
SQL
select r.*,s.* from r inner join s on r.c=s.c
结果
A | B | C | C | D |
---|---|---|---|---|
a1 | b1 | c1 | c1 | d1 |
a2 | b2 | c2 | c2 | d2 |
左连接结果
SQL
select r.*,s.* from r left join s on r.c=s.c
结果
A | B | C | C | D |
---|---|---|---|---|
a1 | b1 | c1 | c1 | d1 |
a2 | b2 | c2 | c2 | d2 |
a3 | b3 | c3 |
右连接结果
SQL
select r.*,s.* from r right join s on r.c=s.c
结果
A | B | C | C | D |
---|---|---|---|---|
a1 | b1 | c1 | c1 | d1 |
a2 | b2 | c2 | c2 | d2 |
c4 | d3 |
全表连接的结果(MySql不支持,Oracle支持)
SQL
select r.*,s.* from r full join s on r.c=s.c
结果
A | B | C | C | D |
---|---|---|---|---|
a1 | b1 | c1 | c1 | d1 |
a2 | b2 | c2 | c2 | d2 |
a3 | b3 | c3 | ||
c4 | d3 |
4、什么是存储过程?有哪些优缺点?
存储过程,就是一些编译好了的SQL语句,这些SQL语句代码像一个方法一样实现一些功能(对单表或多表的增删改查),然后给这些代码块取一个名字,在用到这个功能的时候调用即可。
优点:
1、 存储过程是一个预编译的代码块,执行效率比较高
2、 存储过程在服务器端运行,减少客户端的压力
3、 允许模块化程序设计,只需要创建一次过程,以后在程序中就可以调用该过程任意次,类似方法的复用
4、 一个存储过程替代大量T_SQL语句 ,可以降低网络通信量,提高通信速率
5、 可以一定程度上确保数据安全
缺点:
1、 调试麻烦
2、 可移植性不灵活
3、 重新编译问题
5、优化关联查询
1、 确定ON或者USING子句中是否有索引。
2、 确保GROUP BY和ORDER BY只有一个表中的列,这样MySQL才有可能使用索引。
6、主键和候选键有什么区别?
表格的每一行都由主键唯一标识,一个表只有一个主键。
主键也是候选键。按照惯例,候选键可以被指定为主键,并且可以用于任何外键引用。
7、既然提到了InnoDB使用户的B+树的索引模型
那么你知道为什么采用B+树吗?这和Hash索引比较起来有什么缺点吗?
因为hash索引底层是哈希表,哈希表是一种以key-value存储数据的结构,所以多个数据在存储关系上是完全没有任何顺序关系的,所以,对于区间查询是无法直接通过索引查询的,就需要全表扫描。所以,哈希索引只适用于等值查询的场景。而B+树是一种多路平衡查询树,所以他的节点是天然有序的(左子节点小于父节点,父节点小于右子节点),所以对于范围查询的时候不需要做全表扫描。
8、MySQL_fetch_array和MySQL_fetch_object的区别是什么?
以下是MySQL_fetch_array和MySQL_fetch_object的区别:
MySQL_fetch_array() – 将结果行作为关联数组或来自数据库的常规数组返回。
MySQL_fetch_object – 从数据库返回结果行作为对象。
9、对于关系型数据库而言,索引是相当重要的概念,请回答有关索引的几个问题:
1、 索引的目的是什么?
快速访问数据表中的特定信息,提高检索速度
创建唯一性索引,保证数据库表中每一行数据的唯一性。
加速表和表之间的连接
使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间
2、 索引对数据库系统的负面影响是什么?
负面影响:
创建索引和维护索引需要耗费时间,这个时间随着数据量的增加而增加;索引需要占用物理空间,不光是表需要占用数据空间,每个索引也需要占用物理空间;当对表进行增、删、改、的时候索引也要动态维护,这样就降低了数据的维护速度。
3、 为数据表建立索引的原则有哪些?
在最频繁使用的、用以缩小查询范围的字段上建立索引。
在频繁使用的、需要排序的字段上建立索引
4、 什么情况下不宜建立索引?
对于查询中很少涉及的列或者重复值比较多的列,不宜建立索引。
对于一些特殊的数据类型,不宜建立索引,比如文本字段(text)等
10、MySQL如何优化DISTINCT?
DISTINCT在所有列上转换为GROUP BY,并与ORDER BY子句结合使用。
1
SELECT DISTINCT t1.a FROM t1,t2 where t1.a=t2.a;