背景 今年3月份时候,线上发生一次大事故.公司主要后端服务器发生宕机,所有接口超时.宕机半小时后,又自动恢复正常.但是过了2小时,又再次发生宕机. 通过接口日志,发现MySQL数据库无法响应服务器.在阿里云的技术支持的帮助下,发现了MySQL数据库中存在大量慢查询,导致CPU负载过高.最后,根据慢查询日志,定位到了出问题的SQL和业务接口. 业务接口是一个分页接口,莫名被刷到7000多页,偏移量(offset)高达20w多.每当这条SQL执行时,数据库CPU直接打满.查询时间超过1分钟才有响应.…
一.背景 前面我们讲了SQL分析和索引优化都涉及到了索引,那么什么是索引,它的模型有什么,实现的机制是什么,今天我们来好好讨论下. 二.索引的介绍 索引就相当书的目录,比如一本500页的书,如果你想快速找到其中的某一个知识点,在不借助目录的情况下,你得一点点慢慢的找,要找好一会儿.同样,对于数据库的表,而言,索引就是它的“目录”,提高了数据查询的效率. 比如要运行下面的查询: select first_name from actor where actor_id=5; 如果在actor_id列上…
索引失效情况: 最佳左前缀法则:如果索引了多列,要遵循最左前缀法则,指的是查询从索引的最左前列开始并且不跳过索引中的列:[覆盖索引有a,b,c,条件中使用了b或bc都导致该索引失效:如果条件使用了ac,导致部分索引生效,只使用了a][索引开头第一个不能去掉,中间部分不能断] 不在索引列上做任何操作(计算.函数.(自动或手动)类型转换),会导致索引失效而进行全表扫描:[where条件的字段不做任何操作,否则导致索引失效] 存储引擎不能使用索引中范围条件右边的列:[覆盖索引有a,b,c,a是常量,b…
因为我们大多数情况下使用的都是Innodb,所以这篇博客主要依据Innodb来讲 b+树(图片来自网络) b+树图来自网络 1.聚集索引与非聚集索引区别 聚集索引:叶子节点包含完整的数据(物理地址连续),叫做聚集索引 非聚集索引(又称辅助索引):它的叶子节点并不包含行记录的全部数据,叶子结点除了包含键值以外,每个叶子结点中的索引行还包含了一个书签,该书签用来告诉存储引擎可以在哪找到相应的数据行.需要引用主索引作为data域,其实原理就是直接通过辅助索引无法找到数据,需要通过辅助索引找到主键,然后…
了解一下MySQL中的回表查询与索引覆盖. 回表查询 要说回表查询,先要从InnoDB的索引实现说起.InnoDB有两大类索引,一类是聚集索引(Clustered Index),一类是普通索引(Secondary Index). InnoDB的聚集索引 InnoDB聚集索引的叶子节点存储行记录,因此InnoDB必须要有且只有一个聚集索引. 1.如果表定义了PK(Primary Key,主键),那么PK就是聚集索引. 2.如果表没有定义PK,则第一个NOT NULL UNIQUE的列就是聚集索引.…
回表查询 先通过普通索引的值定位聚簇索引值,再通过聚簇索引的值定位行记录数据 建表示例 mysql> create table user( -> id int(10) auto_increment, -> name varchar(30), -> age tinyint(4), -> primary key (id), -> index idx_age (age) -> )engine=innodb charset=utf8mb4; id 字段是聚簇索引,age…
本篇文章的主旨是对InnoDB存储引擎支持的索引做一个概述,并对索引内部的机制做一个深入的解析,通过了解索引内部构造来了解哪里可以使用索引. 1.InnoDB存储引擎支持以下几种常见的索引: B+树索引 全文索引 哈希索引 前面已经提到过,InnoDB存储引擎支持的哈希索引时自适应的,InnoDB存储引擎会根据表的使用情况自动为表生成哈希索引,不能人为干预是否在一张表中生成哈希索引. B+树索引就是传统意义上的索引,这是目前关系型数据库中查找最为常用和最为有效的索引.B+树索引的构造类似于二叉树…
什么是回表查询 小伙伴们可以先看这篇文章了解下什么是聚集索引和辅助索引:Are You OK?主键.聚集索引.辅助索引,简单回顾下,聚集索引的叶子节点包含完整的行数据,而非聚集索引的叶子节点存储的是每行数据的辅助索引键 + 该行数据对应的聚集索引键(主键值). 假设有张 user 表,包含 id(主键),name,age(普通索引)三列,有如下数据: id name age 1 Jack 18 7 Alice 28 10 Bob 38 20 Carry 48 画一个比较简单比较容易懂的图来看下聚…
1.概念: 覆盖索引:(个人理解)就是包含所有查询记录的索引.当查询量过大时可以采用覆盖索引来进行查询,效率较高. 回表:建立覆盖索引就是避免回表,回表效率会很慢. select查询的字段只有索引列,那么就直接可以从索引表中获取,但是如果select子句中有其他的非索引列,索引就需要到原表中找到相应的列的信息,这就叫回表. 全文索引:解决“关键词搜索”的问题,例如知网搜索文章都是设置关键词来搜索,如果用以往的方法来查询,select * from where like %等这种模糊查询,这种查询…
笔记记录自林晓斌(丁奇)老师的<MySQL实战45讲> (本篇内图片均来自丁奇老师的讲解,如有侵权,请联系我删除) 11) --怎么给字符串字段加索引? 日常工作中的登录系统,你很可能会使用emai这个字段.因此也很容易遇到类似这样的语句: mysql> select *from user where email = 'xxx'; 我们知道,如果没有索引那就只能使用全表扫描.并且MySQL是支持前缀索引的,也就是说,你可以顶一个字符串的一部分作为索引.默认地,如果你创建索引的语句不指定前…