当前位置: 首页 > 知识库问答 >
问题:

mysql - MySQL 组合索引未生效跟查询的列有关系?

左丘凡
2023-07-04

已知表中的列有A B C D E,其中A是主键,B,C是组合索引,请你分析下面的sql能不能用到组合索引:select * from Table where B=1 and C = 2
我问了gpt,回答是可以
image.png
但是我用explain分析sql,却没有走索引
image.png
分析的sql:
EXPLAIN SELECT * FROM combine_indx WHERE c = 3 and b = 4
image.png

b 和 c的顺序不重要,因为sql优化器会自动优化
为什么组合索引没有生效? 是因为select * 查询所有列导致的吗?
我修改为select b,c 索引就会生效

建表sql
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;


-- Table structure for combine_indx


DROP TABLE IF EXISTS combine_indx;
CREATE TABLE combine_indx (
a int(11) NOT NULL AUTO_INCREMENT,
b varchar(255) COLLATE utf8mb4_bin NOT NULL,
c varchar(255) COLLATE utf8mb4_bin NOT NULL,
d varchar(255) COLLATE utf8mb4_bin DEFAULT NULL,
e varchar(255) COLLATE utf8mb4_bin DEFAULT NULL,
PRIMARY KEY (a),
UNIQUE KEY index_u1 (b,c) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=3013 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

SET FOREIGN_KEY_CHECKS = 1;

共有2个答案

丌官嘉勋
2023-07-04

因为select *要回表,所以explain的type是all

房泉
2023-07-04

select *是查所有,你select b, c
E`
XPLAIN SELECT * FROM combine_indx FORCE INDEX (index_u1) WHERE c = 3 and b = 4;

 类似资料:
  • 问题内容: 这是查询: 现在,如果我在字段上添加了带有多列的索引: MySQL将利用此多列索引吗?还是不使用它,因为一个字段位于where子句中,而另一个字段位于order语句中?还是只要我按多列索引的顺序使用字段就没关系吗? 问题答案: 好问题。 索引从左到右起作用,因此您的条件将使用索引。在这种情况下,排序也将利用索引(下面的执行计划)。 从手册: 即使索引与索引不完全匹配,也可以使用索引,只

  • 索引创建完成后,可以利用 SQL 语句查看已经存在的索引。在 MySQL 中,可以使用 SHOW INDEX 语句查看表中创建的索引。 查看索引的语法格式如下: SHOW INDEX FROM <表名> [ FROM <数据库名>] 语法说明如下: <表名>:指定需要查看索引的数据表名。 <数据库名>:指定需要查看索引的数据表所在的数据库,可省略。比如,SHOW INDEX FROM studen

  • 我有一条sql ,不知道为什么会导致索引失效 当我注释掉 select 后面的 pc.name 字段就可以使用索引。 不知道为什么,有没有大佬给我解惑一下。 测试环境中dev_device_log表中只有几百条数据的时候可以走索引,但是我从生产环境随意导出了几万条数据后就无法使用索引了。 不太理解为什么select 后面的字段会影响到索引情况 表结构: 我导出了一份几万条脱敏后的数据,但是不知道怎

  • 主要内容:前 言,索引失效会导致什么后果?,sql优化案例实战,| 体验下无索引的查询效率,| 体验下有索引的查询效率,| sql优化案例:隐式转换导致索引失效,结束语前 言 上一期,我们讲解了sql优化的一般流程,不管是优化join语句、where语句、聚合函数还是排序操作,核心在于利用索引来优化sql语句,但是,大家以为我们为字段创建了索引之后,索引就一定会生效吗? 当然不是的,因为索引可能会失效。 那索引为什么会失效呢?失效之后会导致什么样的后果呢?这一节,我们利用当下的问题,也就是千万级

  • 在MySQL数据库中,我遇到了一个问题,当我在执行一个JOIN查询时,发现查询性能显著降低,特别是在两个大表之间进行JOIN操作时。我的两个表分别是orders(订单表,大约有1000万条记录)和customers(客户表,大约有500万条记录),它们通过customer_id字段相关联。我已经为这两个表的customer_id字段建立了索引,但是在执行如下JOIN查询时,耗时仍然较长: 运行环境

  • 主要内容:GROUP BY单独使用,GROUP BY 与 GROUP_CONCAT() ,GROUP BY 与聚合函数,GROUP BY 与 WITH ROLLUP在 MySQL 中, GROUP BY 关键字可以根据一个或多个字段对查询结果进行分组。 使用 GROUP BY 关键字的语法格式如下: GROUP BY  <字段名> 其中,“字段名”表示需要分组的字段名称,多个字段时用逗号隔开。 GROUP BY单独使用 单独使用 GROUP BY 关键字时,查询结果会只显示每个分组的第一条记录。