记一次sql类型不一致导致的查询巨慢的测试

阅读:431
作者:majingjing
发布:2020-01-16 14:05:08

现在有一个场景,一个collection可以管理item,item包含bgc和ugc

关键表结构如下

精简后的表结构如下

CREATE TABLE `collection_item` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `item_id` varchar(36) NOT NULL COMMENT 'itemID'
  PRIMARY KEY (`id`)
  KEY `idx_item_id` (`item_id`) USING BTREE
) ;

CREATE TABLE `bgc` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',
  `title` varchar(255) NOT NULL COMMENT '标题'
  PRIMARY KEY (`id`)
);
CREATE TABLE `ugc` (
  `id` varchar(32) NOT NULL COMMENT 'id',
  `title` varchar(255) NOT NULL COMMENT '标题'
  PRIMARY KEY (`id`)
);

  • 由于ugc和topic_item的关联字段类型一致,查询会命中索引,
  • 但bgc在做关联查询的时候会出现数据类型不一致,导致 索引idx_item_id不会生效

测试效果

sql执行分析如下图

可以看到在类型不一致的情况下,优先走了 bgc.id 这个 PRIMARY KEYcollection_item.item_id 却没有命中索引,由于这个表的数量集巨大,这种查询导致了性能极差。