MySQL数据库优化·误点解析

@心欲无痕  September 20, 2018

在数据库的优化上可能大家有些是误解的事情,这里需要解答下:关于复合索引生效的问题!

我们大家都知道在进行多个搜索项的SQL编写的时候我们很需要考虑SQL的复合索引,因为这个关系到整个SQL的运行效率问题,在MySQL中支持以下几种索引:单列索引复合索引主键索引唯一索引等至于各个索引的区别,这里就不介绍了,各位自己去看下MySQL的官方文档即可。我们先来看看今天的主要观点:复合索引的生效情况:我们先说明下我们的数据库的表结构:

CREATE TABLE `db_test` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `a` int(11) DEFAULT NULL,
  `b` int(22) DEFAULT NULL,
  `c` char(20) DEFAULT NULL,
  `d` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_a_b` (`a`,`b`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4

我们可以看到针对于当前的的数据表设置了一个复合索引idx_a_b(a, b),那么我们先来总结下生效的场景:

1、仅包含复合索引的 a

2、包含 ab

先来看下相应的SQL:
仅包含 a 列的情况:

EXPLAIN SELECT * FROM db_test WHERE a = 1

查询优化器给出的结果如下:

QQ20180920-210413@2x.png

从上面可以看出使用了索引。

2、包含 ab 两列(注意在AND条件下,所以列的顺序可以随意调整,MySQL一样可以利用索引的)

EXPLAIN SELECT * FROM db_test WHERE a = 1 AND b = 2

QQ20180920-210943@2x.png

效果与下面一样都利用了索引:

EXPLAIN SELECT * FROM db_test WHERE b = 1 AND a = 2

QQ20180920-211148@2x.png

因此我们千万要记住在MySQL中,如果条件之间使用 AND 连接,那么只要是复合索引的列肯定会使用索引就算中间使用其他的字段隔开,也会使用复合索引的:

EXPLAIN SELECT * FROM db_test WHERE b = 1 AND c = "a" AND a = 2

评论已关闭