1. mysql里的索引类型
2. 聚簇索引和非聚簇索引的区别
- 聚簇索引适合场景:
- 主键、唯一性要求高的字段。
- 需要对数据进行范围查询时。
- 对数据的读取频繁,并且数据行的插入和删除较少时。
- 非聚簇索引适合场景:
- 较多的查询条件,或者需要基于某些非主键字段进行查询时。
- 需要创建多个索引来优化不同的查询条件。
- 需要增加查询速度,但数据插入、删除操作频繁时。
- 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 1FROM BWHERE 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’;
+----+-------------+------------+--------+----------