mysql高频面试题

1. mysql里的索引类型

在这里插入图片描述

2. 聚簇索引和非聚簇索引的区别

在这里插入图片描述

  • 聚簇索引适合场景:
    • 主键、唯一性要求高的字段。
    • 需要对数据进行范围查询时。
    • 对数据的读取频繁,并且数据行的插入和删除较少时。
  • 非聚簇索引适合场景:
    • 较多的查询条件,或者需要基于某些非主键字段进行查询时。
    • 需要创建多个索引来优化不同的查询条件。
    • 需要增加查询速度,但数据插入、删除操作频繁时。
      在这里插入图片描述
  1. AB, id, name, 查出A表中存在,在B表里不存在的所有数据

select * from A left join B on A.name= B.name WHERE B.name IS NULL ;

SELECT  A.id, A.name
FROM  A
WHERE  NOT  EXISTS  (
    SELECT  1
    FROM  B
    WHERE  A.id =  B.id
);

3. Mysql锁的机制了解吗?

  • 全局锁:

  • 表级锁:

    • 表锁
    • 元数据锁
    • 意向锁
    • Auto-INC 锁
  • 行级锁

    • Record 锁
    • Gap 锁
    • Next-Key Lock

4. 假设我有一个千万级的数据表,我要在生产环境下加索引

5.1 使用 ONLINE 选项(如果支持)

  • MySQL 5.6 及以上版本支持使用 ONLINE 选项创建索引,可以在不锁定表的情况下创建索引。这有助于避免对查询和插入的干扰。

CREATE INDEX idx_column_name ON table_name (column_name) ONLINE;

5.2 分批次创建索引

如果表非常大,可以考虑分批次创建索引。假设表的数据分布有一定规律,可以将数据分成多个部分,逐步进行索引创建。

步骤:

  • 可以通过分区表(Partitioning)或根据某些条件(如日期、范围)选择性地创建索引。
  • 创建索引时使用 ALGORITHM=INPLACE,可以减少表的锁定时间。

5.3 低流量时段执行索引创建

在生产环境中,通常有低流量时段。可以通过定时任务在低峰期执行索引创建。

5.4 逐步添加索引

对于已经有索引的大表,逐步添加索引可以避免一次性创建多个索引造成的负载过高。每次添加一个索引后,评估系统性能,确保没有重大性能瓶颈后再添加下一个。

5.5 使用 pt-online-schema-change 工具

Percona Toolkit 提供的 pt-online-schema-change 工具可以在不中断服务的情况下安全地对表结构进行更改(如创建索引)。该工具通过创建一个新的表来实现更改,并通过触发器同步数据,这样对生产环境的影响较小。

pt-online-schema-change --alter “ADD INDEX idx_column_name (column_name)” D=your_db,t=your_table --execute

5. 千万级表,保证性能的前提下,才能保证sql是否用到索引。

1. 确保查询语句使用索引

1.1 条件多个时,使用覆盖索引

覆盖索引(Covering Index)是指查询中的所有字段都可以通过索引来访问,而不需要回表(即不需要再访问数据表中的行)。如果查询能够通过索引覆盖完成,它的性能会非常高。

覆盖索引的前提:索引包含了所有查询字段,包括 SELECT 中的字段、WHERE 条件中的字段、JOIN 语句中的字段、ORDER BY 排序的字段等。

CREATE INDEX idx_column1_column2 ON your_table (column1, column2);

SELECT column1, column2 FROM your_table WHERE column1 = ‘value1’ AND column2 = ‘value2’;

column1 和 column2通过覆盖索引就能完成查询,而不需要访问表中的实际数据行。

1.2 使用合适的索引

确保查询条件中的字段有相应的索引。常见的情况包括:

  • WHERE 子句中经常查询的字段。
  • JOIN 连接条件中的字段。
  • ORDER BY 排序的字段。
  • GROUP BY 聚合的字段。

你可以根据实际的查询情况,使用单列索引或复合索引。复合索引尤其有效于多条件查询。

2. 验证查询是否使用索引 - EXPLAIN

使用 EXPLAIN(或 EXPLAIN ANALYZE)来分析查询的执行计划,查看查询是否有效使用了索引。

2.1 使用 EXPLAIN

EXPLAIN SELECT column1, column2 FROM your_table WHERE column1 = ‘value1’ AND column2 = ‘value2’;

+----+-------------+------------+--------+----------
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值