数据库索引优化

主要优化多个单列索引为 一个 多列索引,通过调整为多列索引匹配查询

举例 在评论表为多个单列索引,索引类型为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;

 

  

原文地址:https://www.cnblogs.com/lianruihong/p/10566878.html