如何定位慢查询
在MvSOL的系统配置文件中开启这个慢日志的功能,并且也可以设置SQL执行超过多少时间来记录到一个日志文件中,这样就可以在日志文件找到执行比较慢的SOL了。
一个SQL语句执行很慢,如何分析
候选人: 如果一条sql执行很慢的话,我们通常会使用mysql自动的执行计划explain来去查看这条sql的执行情况
比如第一个在这里面可以通过key和keylen检查是否命中了索引,或者是否有索引失效的情况。
第二个,可以通过type字段查看sql是否有进一步的优化空间,是否存在全索引扫描或全盘扫描。
第三个可以通过extra建议来判断,是否出现了回表的情况,如果出现了,可以尝试添加索引或修改返回字段来修复
索引
什么是聚簇索引,非聚簇索引,回表查询
什么是覆盖索引
面试官:知道什么叫覆盖索引嘛 ?
覆盖索引是指select查询语句使用了索引,在返回的列,必须在索引中全部能够找到,如果我们使用id查询,它会直接走聚集索引查询,一次索引扫描,直接返回数据,性能高。
如果按照二级索引查询数据的时候,返回的列中没有创建索引,有可能会触发回表查询,尽量避免使用select*,尽量在返回的列中都包含添加索引的字段
面试官: MYSOL超大分页怎么处理?
可以采用覆盖索引和子查询来处理。
先分页查询数据的id字段,确定了id之后,再用子查询来过滤,只查询这个id列表中的数据就可以了,因为查询id的时候,走的覆盖索引,所以效率可以提升很多。
索引创建原则有哪些?
第一个是添加索引的字段是查询比较频繁的字段,一般也是像作为查询条件,排序字段或分组的字段这些。
第二个是通常创建索引的时候一般使用复合索引来创建,一条sql的返回值,尽量使用覆盖索引,如果字段的区分度不高的话,我们也会把它放在组合索引后面的字段。
第三个是如果某一个字段的内容较长,我们会考虑使用前缀索引来使用,当然并不是所有的字段都要添加索引,这个索引的数量也要控制,因为添加索引也会导致新增改的速度变慢。
什么情况下索引会失效 ?
sql优化的经验
面试官:你平时对sql语句做了哪些优化呢?
第一个是SELECT语句务必指明字段名称,不要直接使用selet*。
第二个是要注意SOL语句避免造成索引失效的写法。
第三个如果是聚合查询,尽量用union all代替union,union会多一次过滤,效率比较低;
第四个如果是表关联的话,尽量使用inner join,不要使用用left join或right join,如必须使用一定要以小表为驱动
事务的特性是什么?可以详细说一下吗?
并发事务带来哪些问题?
面试官:怎么解决这些问题呢? MySQL的默认隔离级别是?
解决方案是对事务进行隔离,MySOL支持四种隔离级别,分别有:
第一个是未提交读,它解决不了刚才提出的所有问题,一般项目中也不用这个。
第二个是读已提交,它能解决脏读的问题的。
第三个是可重复读,它能解决脏读和不可重复读,这个也是mysql默认的隔离级别。
第四个是串行化,它可以解决刚才提出来的所有问题,但是由于让是事务串行执行的,性能比较低。