前言:
在面试当中mysql可以说是非常重要的,几乎是面试必问,所以今天我们来学习,关于mysql面试部分的第一篇:mysql优化。
在这一篇我们有十四个问题,基本上是涵盖了优化部分的问题,接下来一起来看看吧。
MySQL中,如何定位 慢查询 ?
MySQL本身提供了慢查询日志功能。可以在MySQL的系统配置文件中开启慢查询日志,并设置SQL执行时间超过多少就记录到日志文件,比如我们之前项目设置的是2秒,超过这个时间的SQL就会记录在日志文件中,我们就可以在那里找到执行慢的SQL。
那这个SQL语句执行很 慢,如何分析呢 ?
如果一条SQL执行很慢,我们通常会使用MySQL的EXPLAI``N命令来分析这条SQL的执行情况。通过key和key_len可以检查是否命中了索引,如果已经添加了索引,也可以判断索引是否有效。通过type字段可以查看SQL是否有优化空间,比如是否存在全索引扫描或全表扫描。通过extra建议可以判断是否出现回表情况,如果出现,可以尝试添加索引或修改返回字段来优化。
了解过索引吗?( 什么是索引 )
嗯,索引在项目中非常常见,它是一种帮助MySQL高效获取数据的数据结构,主要用来提高数据检索效率,降低数据库的I/O成本。同时,索引列可以对数据进行排序,降低数据排序的成本,也能减少CPU的消耗。
索引的底层数据结构了解过吗 ?
MySQL的默认存储引擎InnoDB使用的是B+树作为索引的存储结构。选择B+树的原因包括:节点可以有更多子节点,路径更短;磁盘读写代价更低,非叶子节点只存储键值和指针,叶子节点存储数据;B+树适合范围查询和扫描,因为叶子节点形成了一个双向链表。
B树和B+树的区别是什么呢?
B树和B+树的主要区别在于:
-
B树的非叶子节点和叶子节点都存放数据,而B+树的所有数据只出现在叶子节点,这使得B+树在查询时效率更稳定。
-
B+树在进行范围查询时效率更高,因为所有数据都在叶子节点,并且叶子节点之间形成了双向链表。
什么是 聚簇索引什么是非聚簇索引 ?
聚簇索引 就是数据和索引放在一起,叶子节点存的是一整行数据 。InnoDB里主键索引就是聚簇索引。
非聚簇索引 (也叫二级索引)叶子节点存的是主键的值。所以如果通过二级索引查数据,需要先找到主键,再回表查聚簇索引才能拿到完整数据。
知道什么是回表查询吗?
回表查询是指通过二级索引找到对应的主键值,然后再通过主键值查询聚簇索引中对应的整行数据的过程。
知道什么叫 覆盖索引 吗 ?
覆盖索引是指在SELECT查询中,返回的列全部能在索引中找到,避免了回表查询,提高了性能。使用覆盖索引可以减少对主键索引的查询次数,提高查询效率。
MySQL超大分页怎么处理 ?
超大分页通常发生在数据量大的情况下,使用LIMIT分页查询且需要排序时效率较低。可以通过覆盖索引和子查询来解决。首先查询数据的ID字段进行分页,然后根据ID列表用子查询来过滤只查询这些ID的数据,因为查询ID时使用的是覆盖索引,所以效率可以提升。
索引创建原则有哪些?
创建索引的原则包括:
-
表中的数据量超过10万以上时考虑创建索引。
-
选择查询频繁的字段作为索引,如查询条件、排序字段或分组字段。
-
尽量使用复合索引,覆盖SQL的返回值。
-
如果字段区分度不高,可以将其放在组合索引的后面。
-
对于内容较长的字段,考虑使用前缀索引。
-
控制索引数量,因为索引虽然可以提高查询速度,但也会影响插入、更新的速度。
什么情况下索引会失效?
索引可能在以下情况下失效:
-
没有遵循最左匹配原则。
-
使用了模糊查询且
%号在前面。 -
在索引字段上进行了运算或类型转换。
-
使用了复合索引但在中间使用了范围查询,导致右边的条件索引失效。
SQL的优化经验有哪些?
SQL优化可以从以下几个方面考虑:
-
建表时选择合适的字段类型。
-
使用索引,遵循创建索引的原则。
-
编写高效的SQL语句,比如避免使用
SELECT *,尽量使用UNION ALL代替UNION,以及在表关联时使用INNER JOIN。 -
采用主从复制和读写分离提高性能。
-
在数据量大时考虑分库分表。
创建表的时候,你们是如何优化的呢?
-
字段类型够用就好 ,比如能用
int不用bigint,能用varchar(50)不用varchar(255) -
尽量用not null,可以加默认值,因为null会让索引和统计变得更复杂
-
主键最好是自增的,这样B+树插入时是顺序追加,不会频繁分裂
-
如果确定不会用事务,可以考虑
MyISAM(不过现在基本都是InnoDB) -
合理规划分表分库,避免单表数据量过大
在使用索引的时候,是如何优化呢?
在使用索引时,我们遵循索引创建原则,确保索引字段是查询频繁的,使用复合索引覆盖SQL返回值,避免在索引字段上进行运算或类型转换,以及控制索引数量。