现在有一个场景,一个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 KEY
而 collection_item.item_id
却没有命中索引,由于这个表的数量集巨大,这种查询导致了性能极差。