mysql5.7一个关于索引的奇怪问题

有个表ra203长这样:

CREATE TABLE `ra203`  (
  `id` bigint(0) NOT NULL AUTO_INCREMENT,
  `CompanyID` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '',
  `CompanyName` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `StatDate` date NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE,
  INDEX `IDX_RA203_A`(`CompanyID`, `StatDate`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

当表里面的记录大于8行的时候,执行下面的查询,不走索引:

select * from ra203 where  CompanyID='39F3DA1758E3F714EF9D71FBAEE750BF' and StatDate > '2019-01-01'
1    SIMPLE    ra203        ALL    IDX_RA203_A    9    100    Using where

但是,当删除一行到8行记录的时候,同样的查询就走索引了

1    SIMPLE    ra203        range    IX_RA203_A    IDX_RA203_A    157        1    100    Using index condition

innodb_buffer_pool_size=8M
虽然>在这应该有影响,但是为什么会和行数有关想不明白。
感觉似乎和mysql内存相关的配置有关,但是翻看了文档没有找到,innodb_buffer_pool_size的8M个记录以及索引大小也看不出来问题所在。

讨论数量: 2

可能CompanyID或StatDate为null导致扫全表

2年前 评论
cnfixit (楼主) 2年前

联合索引中,如果查询有某个列的范围查询,其右边所有的列都无法使用索引。

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!