1.如何查看sql语句的执行性能
a.使用explain命令:查看操作行数,是否使用索引(可以验证索引是否起作用),连接的类型等信息。
b.使用show profiles查看执行时间
2.慢查询
在日志中记录运行比较慢的sql语句(需要开启)
3.索引没起作用的情况
a.使用like关键字的查询语句中,如果匹配字符串的第一个字符为“%”则索引不起作用。
b.使用多列索引时(一个索引最多有16个字段),只有查询条件使用了索引中的第一个字段时索引才会被使用。
4.分解关联查询:
将一个大的查询分解成多个小查询,对每个表进行一次查询,然后将查询结果在应用程序中进行关联,很多场景下这样效率会更高。
5.引起慢查询的的原因往往是file sort(文件排序)
6.exists子查询执行原理
select * from a where Id exists(select * from b)
循环取出a表中的每条记录与b表进行比较,但会导致a表无法使用索引。
优化:select * from a inner join b on a.id=b.id
使用inner而不使用left join或者right join,这两个连接顺序是固定的,而 inner的连接顺序和写的顺序无关,交由mysql自行选择。
7.left join,right join,inner join,full join的区别
left join:返回包括左表中的所有记录和右表中连接字段相等的记录
right join:返回右表中的所有记录和左表中连接字段相等的记录
inner join:(等值连接,内连接):只返回两个表中连接字段相等的行;
full join;返回左右表中的所有记录和左右表中连接字段相同的记录。
8.存储过程
存储过程就是一条或多条sql语句的集合,将其封装成一个代码块以复用。
9.触发器
与存储过程不用,触发器时特定事件出现时自动执行或者激活的。
10.索引
分类:普通索引,唯一索引,主键索引,组合索引,全文索引。
11.事物的四大特性
原子性、一致性、隔离性、持续性(永久性)
12.事务并发安全问题
a.脏读:脏数据,一个事务未提交的数据便是脏数据。
b.不可重复读:一个事务在执行期间无论重复读取多少次数据,返回的结果都应该与第一次读取到的数据一致,若不一致,便意味着发生了不可重复读的安全问题。
c.幻读:侧重整行的数据变化,若一个事务在执行期间读取到的结果数量不相同,那就说明读取到了幻影数据,发生了幻读问题。
13.事务隔离级别
a.Read Uncommitted(读取未提交内容):实际应用很少,读数据不加锁,写数据加行级共享锁,提交完释放。
b.Read Committed(读取提交内容):大多数数据库默认事务隔离级别,读数据加行级共享锁,读完释放;写时加行级独占锁,事务结束释放。
c.Repeatable Read(可重读):mysql默认事务隔离级别,读操作加行级共享锁,事务结束释放;写操作加行级独占锁,事务结束释放。
d.Serializable(可串行化):这是最高的隔离级别,读操作时加表级共享锁,事务结束时释放;写操作时加表级独占锁,事务结束时释放。