高性能Mysql笔记 — 索引
index优化
- 对于频繁作为查询条件的字段使用索引
- 注意索引字段类型的隐式转换,数据库类型和应用类型要一致
索引的种类
- 唯一索引,成为索引的列不能重复
- 单列索引,一个索引只包含一列
- 单列前缀索引,有些列较长,不宜使用全长作为索引,可以截取列前面一部分作为索引
- 复合索引(某几列也可以是前缀索引),一个索引包含几个列,复合索引满足最左匹配原则
几个名称
聚簇索引
innodb默认会创建聚簇索引(使用主键聚集数据;如果没有主键,innodb选择一个唯一的非空索引替代;如果没有索引innodb隐式定义一个主键作为聚簇索引),就是将数据按照一个或者多个列排序,然后存储在磁盘上,使用BTree数据结构存储索引,聚簇索引的叶子节点就是数据节点
优点:
- 将相关数据聚集存储,减少IO。比如按照用户id聚集数据,从磁盘读取较少的数据页就可以或者某个用户的全部邮件
- 数据访问更快,因为索引和数据行存储在一起
- 覆盖索引扫描的查询可以直接使用叶子节点中的主键值
缺点:
- 提高的是IO密集型应用,如果数据全部放在内存中,聚簇索引就没有优势了
- 插入速度严重依赖插入顺序。新插入行或者更新主键的时候性能较差,建议一般使用int自增(因为聚簇索引是有序的,如果插入是随机的,则会造成频繁的页分裂,如果使用自增的话,插入总是在最后位置插入,不引起原有顺序的破坏)的主键
- 更新聚簇索引列的代价很高,innodb强制将更新的行移动到新的位置
- 聚簇索引可能导致全表扫描变慢,尤其是行比较稀疏,或者由于页分裂导致数据存储不连续的时候
- 二级索引,也就是非聚簇索引,需要查找两次,而且二级索引的叶子节点包含了主键列,可能导致二级索引较大
非聚簇索引
innodb,也就是二级索引,叶子节点
辅助索引
在聚簇索引之上创建的索引称为辅助索引,辅助索引需要二次查找,叶子节点存储的是主键值,再通过主键值找到数据行的数据页,再通过数据页中的Page Directory找到数据行
覆盖索引
如果索引包含所有满足查询需要的数据,那么这个索引称为覆盖索引,也就是常说的不回表操作。在explain的时候,extra字段是Using index表示就是覆盖索引
高性能的索引策略
- 独立的列:索引列不能使表达式的一部分、函数的参数
- 前缀索引和索引选择性:索引选择性是指,不重复的索引值 / 数据表的总记录数。唯一索引的选择性是1,也就是最好的选择性。一般来说接近n就可以了(n = select count(distinct cloumn) / count(id) from table_name)
- 多列索引:在where条件里使用多个条件的时候,如果每个字段创建各自的索引,mysql会使用union优化。optimizer_switch:控制索引合并
- 多列索引的顺序:BTree存储使用的是顺序存储。在不考虑分组和排序的情况下,将选择性最高的索引放在最前面,还有要考虑每个字段对应值得分布,比如a、b两个字段,a有30个,b有3000个,那么创建索引的时候肯定是a在前。
- 聚簇索引
- 覆盖索引
- 冗余和重复索引,删除重复索引
- 未使用的索引,删除未使用的索引
- 索引和锁,索引可以让查询锁定更少的行,因为通过索引会过滤掉一些行,只会回到表中查询过滤剩下的行,只会锁定这些行
维护索引和表
找到并修复损坏的表
- check table
- repair table
- alter table test engine=innodb,alter table不做任何操作
- 先导出数据,再导入新表
- 使用其他工具
更新索引统计信息
- analyze table,重新生成统计信息,因为优化器会根据统计信息衡量成本
- show index from table_name,查看table_name表的统计信息,会触发系统更新统计信息,给系统带来额外的压力
- infomation_schema.statistics
减少索引和数据碎片
- 行碎片(innodb不会出现,因为innodb会移动短小的行并重写到一个片段中)
- 行间碎片
- 剩余空间碎片
以上三种情况myisam都会出现
通过optimize table整理数据
innodb可以通过先删除索引再生成索引的方法消除碎片
对于不支持optimize table的引擎可以通过no-op的alter table重建表来消除碎片
explain
type
- index:使用索引扫描来排序
extra
- using index:覆盖索引
高性能Mysql笔记 — 索引的更多相关文章
- 高性能MySQL笔记 第5章 创建高性能的索引
索引(index),在MySQL中也被叫做键(key),是存储引擎用于快速找到记录的一种数据结构.索引优化是对查询性能优化最有效的手段. 5.1 索引基础 索引的类型 索引是在存储引擎层而 ...
- 高性能MySQL之索引深入原理分析
一.背景 我们工作中经常打交道的就是索引,那么到底什么是索引呢?例如,当一个SQL查询比较慢的时候,你可能会说给“某个字段加个索引吧”之类的解决方案. 总的来说索引的出现其实就是为了提高数据查询的效率 ...
- 高性能MySQL笔记-第5章Indexing for High Performance-004怎样用索引才高效
一.怎样用索引才高效 1.隔离索引列 MySQL generally can’t use indexes on columns unless the columns are isolated in t ...
- 高性能MySQL笔记-第5章Indexing for High Performance-005聚集索引
一.聚集索引介绍 1.什么是聚集索引? InnoDB’s clustered indexes actually store a B-Tree index and the rows together i ...
- 高性能MySQL笔记-第5章Indexing for High Performance-003索引的作用
一. 1. 1). Indexes reduce the amount of data the server has to examine.2). Indexes help the server av ...
- 高性能MySQL笔记 第6章 查询性能优化
6.1 为什么查询速度会慢 查询的生命周期大致可按照顺序来看:从客户端,到服务器,然后在服务器上进行解析,生成执行计划,执行,并返回结果给客户端.其中“执行”可以认为是整个生命周期中最重要的阶段. ...
- 读高性能MySql笔记
1.1 MySQL逻辑架构 MySql服务器逻辑架构图 1.连接管理与安全性 每个客户端连接都会在服务器进程中拥有一个线程,这个连接的查询只会在这个单独的线程中执行,该线程只能轮流在某个CPU核心或者 ...
- 高性能MySQL笔记 第4章 Schema与数据类型优化
4.1 选择优化的数据类型 通用原则 更小的通常更好 前提是要确保没有低估需要存储的值范围:因为它占用更少的磁盘.内存.CPU缓存,并且处理时需要的CPU周期也更少. 简单就好 简 ...
- 高性能MySQL笔记:第1章 MySQL架构
MySQL 最重要.最与众不同的特性是他的存储引擎架构,这种架构的设计将查询处理(Query Precessing)及其系统任务(Server Task)和数据的存储/提取相分离. 1.1 MyS ...
随机推荐
- [转]etcd 启用 https
1, 生成 TLS 秘钥对 2,拷贝密钥对到所有节点 3,配置 etcd 使用证书 4,测试 etcd 是否正常 5,配置 kube-apiserver 使用 CA 连接 etcd 6,测试 kube ...
- 牛客网华为机试题之Python解法
牛客网华为机试题之Python解法 第1题 字符串最后一个单词的长度 a = input().split(" ") print(len(a[-1])) 第2题 计算字符个数 a = ...
- 【CF486E】LIS of Sequence题解
[CF486E]LIS of Sequence题解 题目链接 题意: 给你一个长度为n的序列a1,a2,...,an,你需要把这n个元素分成三类:1,2,3: 1:所有的最长上升子序列都不包含这个元素 ...
- influence maximization
Robust Influence Maximization 首先简要介绍一下这个问题:在一个社交网络图中寻找固定数量的节点,使得这些节点对所有节点的影响值尽可能的大.这个问题由于在病毒式营销,谣言监控 ...
- 微软SSAS 错误 Internal error: Invalid enumeration value. Please call customer support! 不是此元素的有效值。
错误 118 Internal error: Invalid enumeration value. Please call customer support! 不是此元素的有效值. 错误 119 分析 ...
- 关于c++的一篇随笔
众所周知c++是一门极其深奥的学科,正因为其深奥之处,才会让人们觉得学习起来特别难.当然,我想说我自己也不例外,想起当初就像一场噩梦一样,直到今日还历历在目.尽管如此,c++还是一门相当有魅力的课程, ...
- 【.NET Core项目实战-统一认证平台】第二章网关篇-定制Ocelot来满足需求
[.NET Core项目实战-统一认证平台]开篇及目录索引 这篇文章,我们将从Ocelot的中间件源码分析,目前Ocelot已经实现那些功能,还有那些功能在我们实际项目中暂时还未实现,如果我们要使用这 ...
- JAVA RSA加密AES加密
RSA加密: import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; import javax.crypto.Cipher; imp ...
- 安全圈玩起了直播,"学霸”带你玩转CTF
[i春秋]安全圈玩起了直播,"学霸”带你玩转CTF 跟着学霸(汪神)打CTF,摸清CTF套路 汪神,是浙江大学电气工程系的“风云人物”,曾因首度破解特斯拉汽车安全系统而名声大噪.本套题目是自 ...
- 新手入门:目前为止最透彻的的Netty高性能原理和框架架构解析
1.引言 Netty 是一个广受欢迎的异步事件驱动的Java开源网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端. 本文基于 Netty 4.1 展开介绍相关理论模型,使用场景,基本组件 ...