网站建设主流技术及效果,wordpress目录说明,北京超市网站建设,怎么制作网站表白目录
前言
1.在Mysql中#xff0c;如何定位慢查询#xff1f;
2.那这条SQL语句执行的很慢#xff0c;如何分析#xff08;优化#xff09;呢#xff1f;
3.了解过索引吗#xff1f;#xff08;什么是索引#xff1f;#xff09;
4.索引的底层结构了解过吗#…目录
前言
1.在Mysql中如何定位慢查询
2.那这条SQL语句执行的很慢如何分析优化呢
3.了解过索引吗什么是索引
4.索引的底层结构了解过吗
5.B树和B树的区别是什么呢?
6.什么是聚簇索引什么是非聚簇索引什么是聚集索引什么是二级索引
7.知道什么是回表查询嘛 ?
8.知道什么叫覆盖索引嘛?
9.Mysql超大分页怎么处理?
10.索引创建原则有哪些?
11.什么情况下索引会失效?
12.谈一谈你对sql优化的经验。
总结 前言
本文主要介绍了Mysql优化相关的面试题目。 1.在Mysql中如何定位慢查询
参考回答之前我们有个项目做压测的时候有的接口非常的慢接口的响应时间超过了2秒以上因为在MySOL中也提供了慢日志查询的功能可以在MySOL的系统配置文件中开启这个慢日志的功能并且也可以设置SOL执行超过多少时间来记录到一个日志文件中所以我们设置项目配置为2秒只要SOL执行的时间超过了2秒就会记录到日志文件中我们就可以在日志文件找到执行比较慢的SOL了。当然如果系统部署了运维的监控系统Skywalking等工具可以在其展示的报表中可以看到是哪一个接口比较慢并且可以分析这个接口哪部分比较慢可以看到SOL的具体的执行时间所以可以定位是哪个sql出了问题。
2.那这条SQL语句执行的很慢如何分析优化呢
可以采用MySQL自带的分析工具EXPLAIN
通过key和key_len检查是否命中了索引(索引本身存在是否有失效的情况)
通过type字段查看sql是否有进一步的优化空间是否存在全索引扫描或全盘扫描
通过extra建议判断是否出现了回表的情况如果出现了可以尝试添加索引或修改返回字段来修复
参考回答如果一条sql执行很慢的话我们通常会使用mvsql自动的执行计划explain来去查看这条sql的执行情况比如在这里面可以通过key和key_len检查是否命中了索引如果本身已经添加了索引也可以判断索引是否有失效的情况第二个可以通过type字段查看sql是否有进一步的优化空间是否存在全索引扫描或全盘扫描第三个可以通过extra建议来判断是否出现了回表的情况如果出现了可以尝试添加索引或修改返回字段来修复。
3.了解过索引吗什么是索引
索引(index)是帮助MySQL高效获取数据的数据结构(有序)。
提高数据检索的效率降低数据库的IO成本(不需要全表扫描)。
通过索引列对数据进行排序降低数据排序的成本降低了CPU的消耗。
参考回答索引在项目中还是比较常见的它是帮助MySOL高效获取数据的数据结构主要是用来提高数据检索的效率降低数据库的IO成本同时通过索引列对数据进行排序降低数据排序的成本也能降低了CPU的消耗。
4.索引的底层结构了解过吗
MySQL的InnoDB擎采用的B树的数据结构来存储索引。
阶数更多路径更短。
磁盘读写代价B树更低非叶子节点只存储指针叶子阶段存储数据。
B树便于扫库和区间查询叶子节点是一个双向链表。
参考回答MySQL的默认的存储引擎lnnoDB采用的B树的数据结构来存储索引选择B树的主要的原因是第一阶数更多路径更短第二个磁盘读写代价B树更低非叶子节点只存储指针叶子阶段存储数据第三是B树便于扫库和区间查询叶子节点是一个双向链表。
5.B树和B树的区别是什么呢?
在B树中非叶子节点和叶子节点都会存放数据而B树的所有的数据都会出现在叶子节点在查询的时候B树查找效率更加稳定。
在进行范围查询的时候B树效率更高因为B树都在叶子节点存储并且叶子节点是一个双向链表。
6.什么是聚簇索引什么是非聚簇索引什么是聚集索引什么是二级索引
聚簇索引(聚集索引)数据与索引放到一块B树的叶子节点保存了整行数据有且只有一个。
非聚簇索引(二级索引)数据与索引分开存储B树的叶子节点保存对应的主键可以有多个。
聚集索引选取规则:
如果存在主键主键索引就是聚集索引。
如果不存在主键将使用第一个唯一 (UNIQUE)索引作为聚集索引。
如果表没有主键或没有合适的唯一索引则InnoDB会自动生成一个rowid作为隐藏的聚集索引。
参考回答聚簇索引主要是指数据与索引放到一块B树的叶子节点保存了整行数据有且只有一个一般情况下主键在作为聚簇索引非聚簇索引指的是数据与索引分开存储B树的叶子节点保存对应的主键可以有多个一般我们自己定义的索引都是非聚簇索引。
7.知道什么是回表查询嘛 ?
通过二级索引找到对应的主键值到聚集索引中查找整行数据这个过程就是回表。
参考回答跟刚才介绍的聚簇索引和非聚簇索引是有关系的回表的意思就是通过二级索引找到对应的主键值然后再通过主键值找到聚集索引中所对应的整行数据这个过程就是回表。如果面试官直接问回表则需要先介绍聚簇索引和非聚簇索引
8.知道什么叫覆盖索引嘛?
覆盖索引是指查询使用了索引返回的列必须在索引中全部能够找到。
使用id查询直接走聚集索引查询一次索引扫描直接返回数据性能高。
如果返回的列中没有创建索引有可能会触发回表查询尽量避免使用select * 。
参考回答覆盖索引是指select查询语句使用了索引返回的列必须在索引中全部能够找到如果我们使用id查询它会直接走聚集索引查询一次索引扫描直接返回数据性能高。如果按照二级索引查询数据的时候返回的列中没有创建索引有可能会触发回表查询尽量避免使用select * 尽量在返回的列中都包含添加索引的字段。
9.Mysql超大分页怎么处理?
问题在数据量比较大时limit分页查询需要对数据进行排序效率低。
解决方案覆盖索引子查询。
参考回答超大分页一般都是在数据量比较大时我们使用了limit分页查询并且需要对数据进行排序这个时候效率就很低我们可以采用覆盖索引和子查询来解决。先分页查询数据的id字段确定了id之后再用子查询来过滤只查询这个id列表中的数据就可以了因为查询id的时候走的覆盖索引所以效率可以提升很多。
10.索引创建原则有哪些?
数据量较大且查询比较频繁的表
常作为查询条件、排序、分组的字段
字段内容区分度高
内容较长使用前缀索引
尽量联合索引
要控制索引的数量
如果索引列不能存储NULL值请在创建表时使用NOT NULL约束它
参考回答这个情况有很多不过都有一个大前提就是表中的数据要超过10万以上我们才会创建索引并且添加索引的字段是查询比较频繁的字段一般也是像作为查询条件排序字段或分组的字段这些。还有就是我们通常创建索引的时候都是使用复合索引来创建一条sql的返回值尽量使用覆盖索引如果字段的区分度不高的话我们也会把它放在组合索引后面的字段。如果某一个字段的内容较长我们会考虑使用前缀索引来使用当然并不是所有的字段都要添加索引这个索引的数量也要控制因为添加索引也会导致新增改的速度变慢。
11.什么情况下索引会失效?
违反最左前缀法则。
范围查询右边的列不能使用索引。
在索引列上进行运算操作索引将失效。
字符串不加单引号造成索引失效(类型转换)。
以%开头的Like模糊查询索引失效。
参考回答比如索引在使用的时候没有遵循最左匹配法则第二个是模糊查询如果%号在前面也会导致索引失效。如果在添加索引的字段上进行了运算操作或者类型转换也都会导致索引失效。如果使用了复合索引中间使用了范围查询右边的条件索引也会失效。所以通常情况下想要判断出这条Sql是否有索引失效的情况可以使用explain执行计划来分析。
12.谈一谈你对sql优化的经验。
表的设计优化数据类型的选择。
索引优化索引创建原则。
sql语句优化避免索引失效避免使用 select * 。
主从复制、读写分离不让数据的写入影响读操作。
分库分表。
参考回答Sql优化的话会从这几方面考虑比如建表的时候、使用索引、Sql语句的编写、主从复制读写分离如果数据量比较大的话可以考虑分库分表。创建表的时候可以参考的阿里的开发手册比如在定义字段的时候需要结合字段的内容来选择合适的类型如果是数值的话像tinyint、int、bigint这些类型要根据实际情况选择如果是字符串类型也是结合存储的内容来选择char和varchar或者text类型。在使用索引的时候可以参考索引创建原则。然后还可以对sql语句进行优化比如SELECT语句务必指明字段名称不要直接使用select * 注意SOL语句避免造成索引失效的写法如果是聚合查询尽量用union all代替union因为union会多一过滤效率比较低如果是表关联的话尽量使用inner join 不要使用用left join 和 right join如必须使用一定要以小表为驱动。 总结
本文主要介绍了Mysql优化相关的面试题目。