zoukankan      html  css  js  c++  java
  • 数据库索引优化

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

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

      

  • 相关阅读:
    Select2插件ajax方式加载数据并刷新页面数据回显
    转 proguard 混淆工具的用法 (适用于初学者参考)
    转 【Android】- Android与html5交互操作
    转 android开发笔记之handler+Runnable的一个巧妙应用
    转 Android 多线程:手把手教你使用AsyncTask
    转 android design library提供的TabLayout的用法
    转 Android Lifecycle、ViewModel和LiveData
    转 onSaveInstanceState()和onRestoreInstanceState()使用详解
    转 MessageDigest来实现数据加密
    转 GSON
  • 原文地址:https://www.cnblogs.com/lianruihong/p/10566878.html
Copyright © 2011-2022 走看看