1、说下左连接和右连接

首先左连接、右连接和全连接都是外连接的一种

左连接是以左表为基础,根据ON后给出的两表的条件将两表连接起来。结果会将左表所有的查询信息列出,而右表只列出ON后条件与左表满足的部分,空出的部分用null值填充

右连接巴拉巴拉,类似于上。其实这些概念问题,实在说不清,可以贴图理解

mysql左连接优化 mysql左连接原理_mysql左连接优化

 

2、介绍下索引,你对索引的了解

索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。如果想按特定职员的姓来查找人的话,则与在表中搜索所有的行相比,索引有助于更快地获取信息。

简而言之,数据库索引是排好序的数据结构,mysql数据库使用B+树来实现的。

例如这样一个查询:select * from table1 where id=10000。如果没有索引,必须遍历整个表,直到ID等于10000的这一行被找到为止;有了索引之后(必须是在ID这一列上建立的索引),即可在索引中查找。由于索引是经过某种算法优化过的,因而查找次数要少的多。可见,索引是用来定位的。一般在创建主键时会自动创建主键索引

3、sql语句的优化方向

1、应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
2、应该尽量避免在where子句中使用!=或<>操作符,也应尽量避免用null值进行判断,否则将引擎放弃索引而进行全表扫描
3、应尽量避免在where子句中使用or来连接条件,而使用union all
4、不要写一些没有意义的查询,如需要生成一个空表结构

......

4、where 和 having区别

1、两者在select语句中都可以作为条件;
2、where是在分组之前对数据进行过滤,having是在分组之后对数据进行过滤;
3、where后面不能接聚合函数,having可以;
4、where常用于精准查询,除了与like配合使用之外;
5、having的使用必须与group by 结合使用,否则报错。

5、列举不适合建立索引的场景

1、数据少的表
当数据比较少的时候,索引的优势就不明显了,因为数据库的存储引擎也是非常快的,相较于需要查询索引在进行回表操作,可能直接查询的性能会更高一些,所以数据相对较少的表不建议建立索引

2、有大量重复数据的字段
类似于性别字段,只有“男”和“女”两个不同的值,所以索引一半的数据是“男”一半的数据是“女”,那么建立索引并不能进行快速的查询等,所以不建议在有大量重复数据的列上建立索引

3、频繁更新的表(update/delete/insert)
因为表中更新数据的时候,索引也是需要进行对应的维护的,如果一个表近期需要频繁的进行增删改操作,那么就需要耗费大量的时间去维护索引,不建议建立索引,可以在需要进行频繁的更新操作的时候将索引删除,更新完毕之后重建索引

4、没有使用的字段(where/group by/order by)
不是where/group by/order by后面的字段没有必要建立索引,因为不会使用到该索引

5、不要定义冗余索引
这里因为username作为第一个联合索引的第一个字段,所以索引就是按照username进行排序,在username相同的情况下按照password、address排序,所以也就是实现了单独拿username列作为索引的功能,即第二个索引就是多余的

6、什么是数据库事务?什么情况下使用事务?事务有什么特点?

1、把多条语句作为一个整体进行操作的功能,被称为数据库事务。数据库事务可以确保该事务范围内的所有操作都可以全部成功或者全部失败。如果事务失败,那么效果就和没有执行这些SQL一样,不会对数据库数据有任何改动。
2、对数据安全性要求非常高的情况下都建议使用事务,例如 钱相关
3、事务特点简称为 ACID
A:Atomic,原子性,将所有SQL作为原子工作单元执行,要么全部执行,要么全部不执行;
C:Consistent,一致性,事务完成后,所有数据的状态都是一致的,即A账户只要减去了100,B账户则必定加上了100;
I:Isolation,隔离性,如果有多个事务并发执行,每个事务作出的修改必须与其他事务隔离;
D:Duration,持久性,即事务完成后,对数据库数据的修改被持久化存储。