主要优化多个单列索引为 一个 多列索引,通过调整为多列索引匹配查询
举例 在评论表为多个单列索引,索引类型为B+tree
target_id 单列
target_type 单列
` CREATE TABLE `comments` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, `deleted_at` timestamp NULL DEFAULT NULL, `target_id` int(11) NOT NULL, `target_type` tinyint(4) NOT NULL, `comment` varchar(800) COLLATE utf8mb4_unicode_ci NOT NULL, `pictures` varchar(800) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `user_id` int(11) NOT NULL, `reply_to` int(11) DEFAULT NULL, `state` tinyint(1) NOT NULL DEFAULT '2', `reply_user_id` int(11) DEFAULT NULL, `reply_user_name` varchar(30) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `user_name` varchar(30) COLLATE utf8mb4_unicode_ci NOT NULL, `thread_id` int(11) DEFAULT NULL COMMENT `is_top` int(11) NOT NULL DEFAULT '0' COMMENT '是否置顶', PRIMARY KEY (`id`), KEY `comments_target_id` (`target_id`), KEY `comments_target_type` (`target_type`), KEY `comments_thread_id_index` (`thread_id`) ) ENGINE=InnoDB AUTO_INCREMENT=61505 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
`
而业务上使用最多的查询为
`
select * from comments where target_id=? and target_type=? order by id desc limit 10
`
在这时侯,两个单列索引 在innobd 存储引擎上 发生索引合并(index_merge),这时效率反而变差
优化的方案为两个单列索引改为一个多列索引
` CREATE TABLE `comments` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, `deleted_at` timestamp NULL DEFAULT NULL, `target_id` int(11) NOT NULL, `target_type` tinyint(4) NOT NULL, `comment` varchar(800) COLLATE utf8mb4_unicode_ci NOT NULL, `pictures` varchar(800) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `user_id` int(11) NOT NULL, `reply_to` int(11) DEFAULT NULL, `state` tinyint(1) NOT NULL DEFAULT '2', `reply_user_id` int(11) DEFAULT NULL, `reply_user_name` varchar(30) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `user_name` varchar(30) COLLATE utf8mb4_unicode_ci NOT NULL, `thread_id` int(11) DEFAULT NULL COMMENT PRIMARY KEY (`id`), KEY `comments_target_id_target_type_index` (`target_id`,`target_type`), KEY `comments_thread_id_index` (`thread_id`) ) ENGINE=InnoDB AUTO_INCREMENT=61505 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;