联合索引,最左匹配,范围查询

定义

联合索引是MySQL中常用的索引类型之一,它是由多个列组合而成的索引。联合索引可以帮助优化查询,提高查询效率,尤其是在多个列同时参与查询时。

最左匹配是指在联合索引中,如果查询条件中只涉及到联合索引中的最左侧列,那么可以利用该联合索引进行快速匹配。如果查询条件中还涉及到联合索引中的其他列,那么查询优化器可能无法充分利用联合索引,从而导致性能下降。

范围查询是指查询条件中涉及到了比较运算符(>, <, >=, <=, BETWEEN, IN等),这类查询条件无法使用“=”运算符进行匹配,需要进行范围匹配。最左匹配原则遇到范围查询就停止匹配。

例:

id | name | age | address

现在要在该表上建立一个联合索引,由name和age组成,即:

CREATE INDEX idx_name_age ON t (name, age);

设有两个查询:

  1. SELECT id FROM t WHERE id > 5 AND age>25;
  2. SELECT id FROM t WHERE age>25;
  3. SELECT id FROM t WHERE id = 5 AND age>25;

查询一,可以使用联合索引进行最左匹配。查询优化器可以利用联合索引进行快速匹配,定位到符合条件的数据行。

查询二,不可以匹配;虽然也涉及到了联合索引的一部分age,但是查询条件中没有涉及到联合索引的最左侧列id,因此无法进行最左匹配。在这种情况下,查询优化器可能会选择全表扫描或者使用其他索引进行查询,从而导致性能下降。

查询三,不可以匹配;最左匹配原则遇到范围查询就停止匹配。

Q:SELECT id FROM t WHERE age>25 AND id > 5 ; 是否可以匹配索引?

能;Mysql有优化器会自动调整顺序与索引顺序一致。

Q: 对下面的查询如何建立查询?

SELECT * FROM table 
WHERE a = 1 and b = 2 and c = 3; 

重点要的是将区分度高的字段放在前面,区分度低的字段放后面。像性别、状态这种字段区分度就很低,我们一般放后面。

例如假设区分度由大到小为b,a,c。那么我们就对(b,a,c)建立索引。在执行sql的时候,优化器会帮我们调整wherea,b,c的顺序,让我们用上索引。

REF:(28条消息) mysql 联合索引_TanaStudy的博客-CSDN博客

你可能感兴趣的:(数据库,mysql,sql,数据库)