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;
    
     
    

      

  • 相关阅读:
    MVC4.0系统开发新手历程1
    hdu1205(类似 分布垃圾数列)
    python manage.py startapp app 时候报错No module named _sqlite3
    delphi 文件夹权限设置(执行一个小脚本的笨办法)
    FreeBSD 10安装KDE桌面环境简介(亲测bsdconfig命令有效)
    Qt的目录依赖问题----怎样生成一个绿色的Qt软件包
    Qt5位置相关函数异同详解(附源码)
    Qt 设置背景图片3种方法(三种方法:QPalette调色板,paintEvent,QSS)
    简单实现android和wp聊天
    进程间通讯之mmap文件共享
  • 原文地址:https://www.cnblogs.com/lianruihong/p/10566878.html
Copyright © 2011-2022 走看看