MST
星途 面试题库

面试题:MySQL索引列不重复值个数在复杂查询场景下的性能优化策略

在复杂查询场景下,如涉及多表关联、子查询等,索引列不重复值个数对整体查询性能的影响较为复杂。请阐述如何根据索引列不重复值个数来制定性能优化策略,包括但不限于索引的设计、查询语句的改写等方面,并结合具体案例进行说明。
41.8万 热度难度
数据库MySQL

知识考点

AI 面试

面试题答案

一键面试

索引列不重复值个数对查询性能的影响及优化策略

  1. 索引设计
    • 高不重复值个数(选择性高)
      • 策略:对于索引列不重复值个数较多(即选择性高)的情况,适合创建单列索引。例如,在一个employees表中有employee_id列,每个员工的employee_id都是唯一的,这种情况下为employee_id列创建单列索引,数据库在查询时能快速定位到符合条件的记录。假设我们有如下查询:
SELECT * FROM employees WHERE employee_id = 123;

如果employee_id列有索引,数据库可以使用索引快速定位到employee_id为123的记录,大大提高查询效率。

  • 低不重复值个数(选择性低)
    • 策略:当索引列不重复值个数较少(选择性低)时,单列索引效果不佳。可以考虑创建联合索引,但要注意索引列的顺序。例如,在一个orders表中有status列,其值可能只有'completed''pending''cancelled'等几种状态。如果单独为status列创建索引,查询时数据库可能需要扫描大量记录。但如果经常有查询是基于statuscustomer_id(假设customer_id选择性较高)的,可创建联合索引(status, customer_id)。比如查询:
SELECT * FROM orders WHERE status = 'completed' AND customer_id = 456;

数据库可以先利用status缩小范围,再通过customer_id精准定位,提高查询效率。 2. 查询语句改写

  • 高不重复值个数(选择性高)
    • 策略:查询语句尽量利用索引列进行过滤。例如在上述employees表中,如果查询SELECT * FROM employees WHERE employee_id BETWEEN 100 AND 200;,由于employee_id有索引,该查询可以利用索引的范围扫描功能,高效获取结果。
  • 低不重复值个数(选择性低)
    • 策略:如果索引列选择性低,避免在索引列上使用函数或表达式。例如在orders表的order_date列(假设选择性低),如果有查询SELECT * FROM orders WHERE YEAR(order_date) = 2023;,数据库无法使用order_date列的索引,因为对order_date使用了YEAR函数。可以改写为SELECT * FROM orders WHERE order_date >= '2023 - 01 - 01' AND order_date < '2024 - 01 - 01';,这样可以利用order_date列可能存在的索引提高查询效率。

总之,根据索引列不重复值个数来合理设计索引和改写查询语句,能有效提升复杂查询场景下的性能。