话说有这么一个表:

CREATE TABLE `user_group` (

`id` int(11) NOT NULL auto_increment,

`uid` int(11) NOT NULL,

`group_id` int(11) NOT NULL,

PRIMARY KEY (`id`),

KEY `uid` (`uid`),

KEY `group_id` (`group_id`),

) ENGINE=InnoDB AUTO_INCREMENT=750366 DEFAULT CHARSET=utf8

看AUTO_INCREMENT就知道数据并不多,75万条。然后是一条简单的查询:

SELECT SQL_NO_CACHE uid FROM user_group WHERE group_id = 245;

很简单对不对?怪异的地方在于:

如果换成MyISAM做存储引擎的时候,查询耗时只需要0.01s,用InnoDB却会是0.15s左右

如果只是就这么点差距其实不是什么大不了的事,但是真实的业务需求比这个复杂,造成的差距也很大:MyISAM只需要0.12s,InnoDB则需要2.2s.,最终定位到问题症结是在这条SQL。

Explain的结果是:

+----+-------------+------------+------+---------------+----------+---------+-------+------+-------+

| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |

+----+-------------+------------+------+---------------+----------+---------+-------+------+-------+

| 1 | SIMPLE | user_group | ref | group_id | group_id | 4 | const | 5544 | |

+----+-------------+------------+------+---------------+----------+---------+-------+------+-------

看起来已经用上索引了,而这条SQL语句已经简单到让我无法再优化了。最后请前同事Gaston诊断了一下,他认为:数据分布上,group_id相同的比较多,uid散列的比较均匀,加索引的效果一般,但是还是建议我试着加了一个多列索引:

ALTER TABLE user_group ADD INDEX group_id_uid (group_id, uid);

然后,不可思议的事情发生了……这句SQL查询的性能发生了巨大的提升,居然已经可以跑到0.00s左右了。经过优化的SQL再结合真实的业务需求,也从之前2.2s下降到0.05s。

再Explain一次:

+----+-------------+------------+------+-----------------------+--------------+---------+-------+------+-------------+

| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |

+----+-------------+------------+------+-----------------------+--------------+---------+-------+------+-------------+

| 1 | SIMPLE | user_group | ref | group_id,group_id_uid | group_id_uid | 4 | const | 5378 | Using index |

+----+-------------+------------+------+-----------------------+--------------+---------+-------+------+-------------+

原来是这种叫覆盖索引(covering index),MySQL只需要通过索引就可以返回查询所需要的数据,而不必在查到索引之后再去查询数据,所以那是相当的快!!但是同时也要求所查询的字段必须被索引所覆盖到,在Explain的时候,输出的Extra信息中如果有“Using Index”,就表示这条查询使用了覆盖索引。

mysql 数据库被覆盖_理解MySQL数据库覆盖索引相关推荐

  1. mysql连接数过多 原因_理解MySQL数据库连接数过多的原因

    使用MySQL数据库,有一个容易出现的问题--Too many connections.连接数超过max_connections就会报这个错误.MySQL为了在达到最大连接数时也能给DBA有机会操作, ...

  2. mysql临时文件和临时表_理解mysql的临时表和文件排序

    我们经常看到Mysql的explain语句执行结果Extra字段有using temporary或者using filesort,本文主要是为了理解这两个短语的含义,从而有助于我们进行SQL语句优化. ...

  3. 学一点 mysql 双机异地热备份----快速理解mysql主从,主主备份原理及实践

    学一点 mysql 双机异地热备份----快速理解mysql主从,主主备份原理及实践 原文 学一点 mysql 双机异地热备份----快速理解mysql主从,主主备份原理及实践 感谢大家在上一篇 学一 ...

  4. 【MySQL笔记】正确的理解MySQL的MVCC及实现原理

    MVCC多版本并发控制 如果觉得对你有帮助,能否点个赞或关个注,以示鼓励笔者呢?!博客目录 | 先点这里 !首先声明,MySQL 的测试环境是 5.7 前提概要 什么是 MVCC 什么是当前读和快照读 ...

  5. mysql 锁机制 mvcc_轻松理解MYSQL MVCC 实现机制

    轻松理解MYSQL MVCC 实现机制 轻松理解MYSQL MVCC 实现机制 #### 1. MVCC简介 ##### 1.1 什么是MVCC MVCC是一种多版本并发控制机制. ##### 1.2 ...

  6. 数据库创建函数_达梦数据库创建UUID函数

    数据库创建函数_达梦数据库创建UUID函数 接触达梦数据库有一段时间了,整理了一些资料,今天分享一下达梦数据UUID自定义函数 UUID函数定义 很多数据库都有提供UUID函数,可是接触达梦数据库后, ...

  7. mysql的分区技术作用_理解MySQL数据库分区管理的技术细节

    在MySQL数据库中,表的不同部分在不同的位置被存储为单独的表.分区主要就是用来解决表在不同的位置存储的问题.在其他数据库中,也会存在这种情况.他们将这种类型的数据表称之为分区表.分区的管理,对于My ...

  8. mysql 存储ts数据_理解性记忆MySQL数据库

    理解性记忆MySQL数据库 1.什么是数据库? 本质是文件存储系统.可以简单理解为存储数据的仓库. 2.为什么要使用数据库? 方便数据管理. 3.什么是数据库管理系统? 管理数据库的软件,比如mysq ...

  9. mysql业务数据库回退_理解MySQL数据库事务-隔离性

    Transaction事务是指一个逻辑单元,执行一系列操作的SQL语句. 事务中一组的SQL语句,要么全部执行,要么全部回退.在Oracle数据库中有个名字,叫做transaction ID 在关系型 ...

最新文章

  1. WhyGL:一套学习OpenGL的框架,及翻写Nehe的OpenGL教程
  2. cheked复选框返回值的时候选中
  3. zabbix简单介绍(1)
  4. 异常处理—错误抛出机制
  5. P2596 [ZJOI2006]书架(fhq treap)
  6. Atitit.vod 视频播放系统 影吧系统的架构图 架构体系 解决方案
  7. PLSQL_案例优化系列_明白索引是如何让SQL运行飞快(案例5)
  8. java对mysql进行查找替换_Java对MySQL数据库进行连接、查询和修改【转载】
  9. 销售灵魂人物的潜伏笔记5
  10. ApplePay 支付开发
  11. 你的功夫真的夠了嗎?
  12. AlphaBlend - [Daily APIs]
  13. 山海经电子书古文/翻译白话文版发布,免费电子书。
  14. goproxy代理软件 v10.3 轻量级高性能代理软件+链式代理+正向代理+反向代理
  15. cocos2d-x横版动作游戏《闯关吧》源码
  16. 李梦恬爸爸分享之第十周课程资源
  17. 【赛鱼电竞】用王者荣耀免费改名卡改名和王者荣耀怎么修改昵称及王者荣耀改名卡免费修改昵称方法教程
  18. D99、大佬都在学C/C++ - D系列总纲
  19. 百度云安装mysql_安装mysql5.7和mysql8.0(可同时安装在windows中)附百度云下载链接
  20. Java仓储物流任务调度系统的实现

热门文章

  1. java 如何捕获线程中的异常处理_如何捕获Java中另一个线程抛出的异常?
  2. 如何理解和运用策略模式
  3. 为什么我不建议你使用Java序列化
  4. 机器学习之欠拟合与过拟合
  5. leetcode题解434-字符串中的单词数(双指针经典)
  6. 2019.8.13节点的选取
  7. 关于Google Storage的东西
  8. vue.js入门环境搭建
  9. SpringBoot整合freemarker中自定义标签获取字典表的数据
  10. #运算符、不同的指针类型、数组和指针、指针运算、堆、栈、静态区、只读区、下标VS指针...