网站反链接什么,优化 英语,梧州网页设计,潍坊高新建设局网站背景
对mysql的联合索引的考察是Java程序员面试高频考点#xff01;必须深刻理解掌握否则容易丢分非常可惜。
技术难点
考察对最左侧匹配原理理解。
原理
暂且不表。网上讲这非常多。我理解就是#xff0c;B树每个非叶子节点的值都是有序存放索引的值。
比如对A、B、C …背景
对mysql的联合索引的考察是Java程序员面试高频考点必须深刻理解掌握否则容易丢分非常可惜。
技术难点
考察对最左侧匹配原理理解。
原理
暂且不表。网上讲这非常多。我理解就是B树每个非叶子节点的值都是有序存放索引的值。
比如对A、B、C 三个字段做联合索引。B输每个节点都存储A、B、C的值。首先保证A有序其次保证B有序。
重点看实战。
实战
我们做一次实战记录避免下次面试再次犯错。
环境
mysql版本 5.7.38-log
建表语句
CREATE TABLE user_cart_item (id bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 主键,user_id bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT 用户id,goods_id bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT 商品id,goods_sku_id bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT 商品id 有skuid的话为什么要存商品id,create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 物品篮项目创建时间,update_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 物品篮项目更新时间,sku_price int(10) unsigned NOT NULL DEFAULT 0 COMMENT 价格,PRIMARY KEY (id) USING BTREE,KEY idx_user_cart_item (user_id,goods_id,goods_sku_id) USING BTREE
) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COLLATEutf8mb4_unicode_ci ROW_FORMATDYNAMIC COMMENT物品篮项;
视代码可见我们创建一个联合索引 idx_user_cart_item
查询 查询条件是user_id、goods_id、goods_sku_id一定能匹配上索引没问题
EXPLAIN SELECTuser_id,goods_id, goods_sku_id,sku_price
FROMuser_cart_item
WHEREuser_id248 and goods_id 1 and goods_sku_id 1
结果如下 查询条件是user_id、goods_id一定能匹配上索引没问题
EXPLAIN SELECTuser_id,goods_id, goods_sku_id,sku_price
FROMuser_cart_item
WHEREuser_id248 and goods_id 1
结果如下 查询条件是user_id一定能匹配上索引没问题
EXPLAIN SELECTuser_id,goods_id, goods_sku_id,sku_price
FROMuser_cart_item
WHEREuser_id248
结果如下 查询条件是user_idgoods_sku_id 按最左侧匹配原则也是能使用索引
EXPLAIN SELECTuser_id,goods_id, goods_sku_id,sku_price
FROMuser_cart_item
WHEREuser_id248 and goods_sku_id 1 结果如下 查询条件是goods_sku_id 看能否使用索引
EXPLAIN SELECTuser_id,goods_id, goods_sku_id,sku_price
FROMuser_cart_item
WHEREgoods_sku_id 1
结果如下 重点
不满足最左侧匹配是不能使用联合索引的。
特殊情况不满足最左侧匹配也能使用联合索引
EXPLAIN SELECTuser_id,goods_id, goods_sku_id
FROMuser_cart_item
WHEREgoods_sku_id 1
结果如下
索引类型不是ref而是index。是在索引范围内查找。甚过All 全表扫描 重点
当联合索引能覆盖查询字段覆盖索引。但查询条件并不满足最左侧匹配原则。mysql查询优化器也推荐我们使用联合索引。但索引是index。 也就是索引内查找。