MySQL篇

MySQL中,如何定位慢查询?

MySQL本身提供了慢查询日志功能。可以在MySQL的系统配置文件中开启慢查询日志,并设置SQL执行时间超过多少就记录到日志文件,比如我们之前项目设置的是2秒,超过这个时间的SQL就会记录在日志文件中,我们就可以在那里找到执行慢的SQL。

那这个SQL语句执行很慢,如何分析呢?

如果一条SQL执行很慢,我们通常会使用MySQL的EXPLAI``N命令来分析这条SQL的执行情况。通过keykey_len可以检查是否命中了索引,如果已经添加了索引,也可以判断索引是否有效。通过type字段可以查看SQL是否有优化空间,比如是否存在全索引扫描或全表扫描。通过extra建议可以判断是否出现回表情况,如果出现,可以尝试添加索引或修改返回字段来优化。

什么是索引?

索引是一种帮助MySQL高效获取数据的数据结构,主要用来提高数据检索效率,降低数据库的I/O成本。同时,索引列可以对数据进行排序,降低数据排序的成本,也能减少CPU的消耗。

索引的底层数据结构了解过吗?

MySQL的默认存储引擎InnoDB使用的是B+树作为索引的存储结构。选择B+树的原因包括:节点可以有更多子节点,路径更短;磁盘读写代价更低,非叶子节点只存储键值和指针,叶子节点存储数据;B+树适合范围查询和扫描,因为叶子节点形成了一个双向链表。

B树和B+树的区别是什么呢?

  1. B树的非叶子节点和叶子节点都存放数据,而B+树的所有数据只出现在叶子节点,这使得B+树在查询时效率更稳定。
  2. B+树在进行范围查询时效率更高,因为所有数据都在叶子节点,并且叶子节点之间形成了双向链表。

什么是聚簇索引什么是非聚簇索引?

聚簇索引,又叫:主索引、一级索引、聚集索引

非聚簇索引,又叫:辅助索引、二级索引

聚簇索引是指数据与索引放在一起,B+树的叶子节点保存了整行数据,有且只有一个聚簇索引,一般是由主键构成。

非聚簇索引则是数据与索引分开存储,B+树的叶子节点保存的是主键值,可以有多个非聚簇索引,通常我们自定义的索引都是非聚簇索引。

什么是回表查询?

回表查询是指通过二级索引找到对应的主键值,然后再通过主键值查询聚簇索引中对应的整行数据的过程。

什么叫覆盖索引?

覆盖索引是指在查询中,返回的列全部能在索引中找到,避免了回表查询,提高了性能。使用覆盖索引可以减少对主键索引的查询次数,提高查询效率。

MySQL超大分页怎么处理?

超大分页通常发生在数据量大的情况下,使用LIMIT分页查询且需要排序时效率较低。可以通过覆盖索引和子查询来解决。首先查询数据的ID字段进行分页,然后根据ID列表用子查询来过滤只查询这些ID的数据,因为查询ID时使用的是覆盖索引,所以效率可以提升。

索引创建原则有哪些?

  • 表中的数据量超过10万以上时考虑创建索引。

  • 选择查询频繁的字段作为索引,如查询条件、排序字段或分组字段。

  • 尽量使用复合索引,覆盖SQL的返回值。

  • 如果字段区分度不高,可以将其放在组合索引的后面。

  • 对于内容较长的字段,考虑使用前缀索引。

  • 控制索引数量,因为索引虽然可以提高查询速度,但也会影响插入、更新的速度。

什么情况下索引会失效?

  • 没有遵循最左匹配原则。

  • 使用了模糊查询且%号在前面。

  • 在索引字段上进行了运算或类型转换。

  • 使用了复合索引但在中间使用了范围查询,导致右边的条件索引失效。

SQL的优化经验有哪些?

  • 建表时选择合适的字段类型。

  • 使用索引,遵循创建索引的原则。

  • 编写高效的SQL语句,比如避免使用SELECT *,尽量使用UNION ALL代替UNION,以及在表关联时使用INNER JOIN

  • 采用主从复制和读写分离提高性能。

  • 在数据量大时考虑分库分表。

事务的特性是什么?

事务的特性是ACID,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。例如,A向B转账500元,这个操作要么都成功,要么都失败,体现了原子性。转账过程中数据要保持一致,A扣除了500元,B必须增加500元。隔离性体现在A向B转账时,不受其他事务干扰。持久性体现在事务提交后,数据要被持久化存储。

并发事务带来哪些问题?

并发事务可能导致脏读、不可重复读和幻读。

  • 脏读是指一个事务读到了另一个事务未提交的"脏数据"。
  • 不可重复读是指在一个事务内多次读取同一数据,由于其他事务的修改导致数据不一致。
  • 幻读是指一个事务读取到了其他事务插入的"幻行"。

怎么解决这些问题呢?MySQL的默认隔离级别是?

解决这些问题的方法是使用事务隔离。MySQL支持四种隔离级别:

  1. 未提交读(READ UNCOMMITTED):解决不了任何问题。

  2. 读已提交(READ COMMITTED):能解决脏读,但不能解决不可重复读和幻读。

  3. 可重复读(REPEATABLE READ):能解决脏读和不可重复读,但不能解决幻读,这也是MySQL的默认隔离级别。

  4. 串行化(SERIALIZABLE):可以解决所有问题,但性能较低。

undo log和redo log的区别是什么?

redo log记录的是数据页的物理变化,用于服务宕机后的恢复,保证事务的持久性。而undo log记录的是逻辑日志,用于事务回滚时恢复原始数据,保证事务的原子性和一致性。

事务中的隔离性是如何保证的呢?(解释一下MVCC)

事务的隔离性通过锁和多版本并发控制(MVCC)来保证。MVCC通过维护数据的多个版本来避免读写冲突。底层实现包括隐藏字段、undo logread view。隐藏字段包括trx_idroll_pointerundo log记录了不同版本的数据,通过roll_pointer形成版本链。read view定义了不同隔离级别下的快照读,决定了事务访问哪个版本的数据。

MySQL主从同步原理是什么?

MySQL主从复制的核心是二进制日志(Binlog)。步骤如下:

  1. 主库在事务提交时记录数据变更到Binlog。

  2. 从库读取主库的Binlog并写入中继日志(Relay Log)。

  3. 从库重做中继日志中的事件,反映到自己的数据中。

用过MySQL的分库分表吗?

"分库分表" 通常包含两种拆分方式:

  • 分库:包括垂直分库(把同一业务的数据按规则拆到同一个库,不同业务的数据拆到不同的库)和水平分库(把同一业务的数据按规则拆到多个库)。
  • 分表:包括垂直分表(把一个表的字段按冷热拆成多个表)和水平分表(把一个表的数据按规则拆成多个表)。

xx项目采用微服务架构,每个微服务对应一个数据库,是根据业务进行拆分的,这个就是垂直分库

NOSQL和SQL的区别?

SQL数据库,指关系型数据库

关系型数据库存储结构化数据。这些数据逻辑上以行列二维表的形式存在,每一列代表数据的一种属性,每一行代表一个数据实体

相关推荐
Geoking.2 小时前
Redis 的 RDB 与 AOF:持久化机制全解析
数据库·redis·缓存
鱼跃鹰飞3 小时前
面试题:说一说redis和Memcached的区别
数据库·redis·memcached
深念Y3 小时前
中兴微随身WiFi 板号UZ901_v1.6 影腾Y1新版本 增加SIM卡槽 开启ADB 去云控 改串号教程 下
数据库·adb
顾西爵霞3 小时前
远程访问centos7并连接Mariadb
数据库·centos·mariadb
卌卄3 小时前
【Linux】MySQL安装配置
linux·运维·mysql
m0_748229993 小时前
Laravel7.x核心特性全解析
c语言·数据库·c#
weixin_436525073 小时前
若依多租户版: 页面新增菜单, 执行菜单SQL
前端·数据库·sql
2601_949868363 小时前
Flutter for OpenHarmony 电子合同签署App实战 - 数据持久化实现
java·数据库·flutter
无心水3 小时前
数据库字符串类型详解:VARCHAR、VARCHAR2、CHARACTER VARYING的区别与选择指南
数据库·后端·varchar·varchar2·character·字符串类型·2025博客之星