Mysql优化系列之索引性能
实际上,前面的数据类型和表结构设计优化不能算优化,只能算规范,也就是说在设计表的时候,应该且必须做到这些
索引是sql优化的核心部分,在《高性能Mysql》中单独抽出一章讲,也印证了其重要性。这一篇也会讲的很细致。
以下所讲,除少数的如全文索引之外,均以Innodb存储引擎为基本
一、索引是什么
索引,在Mysql中也叫做"键(key)",是存储引擎用于快速找到记录的一种数据结构。
这里我们注意到:索引是一种数据结构,节点是有序的,有大小,有时候一张表的索引甚至会有几个G的大小
另外,索引是在存储引擎层实现的,不同的存储引擎层实现也不同
二、有什么好处
这个问题,一般可能觉得没啥好回答的,但是我会告诉你,好的sql能使查询效率提高几倍几十倍,但是有索引和没索引,
查询的性能可能相隔几个数量级,不相信的读者可以亲自试一试。
三、有哪些类型
Mysql支持的索引类型有很多,我简单的列出几种
B-Tree索引:B-Tree读作B树,不是B减树,一种平衡多路查找树,这种结构的查找效率很高
B+Tree索引:现在大多数版本使用B+Tree索引,可以分为聚集索引(clustered index)和二级索引(secondary index)。
聚集索引的叶子节点存放的是整张表的行记录数据。二级索引的叶子节点并不包含行记录的全部数据,而是存储相应行数据的
聚集索引键,即主键。当通过二级索引来查询数据时,InnoDB存储引擎会遍历二级索引找到主键,然后再通过主键在聚集索引
中找到完整的行记录数据。
哈希索引:基于哈希表实现,这个用的比较少,支持的存储引擎也有限,不讲
全文索引:全文索引适用于查找文本中的关键词,而不是简单的where条件操作,这里也不讲,基本没用到
我们用的最多的B-Tree大致分为普通索引normal,唯一索引unique,联合索引union,另外主键Primary Key也是索引
四、B-Tree索引适用的有效查询情况(这里是重点,写sql一定注意)
- 全值匹配
即为等值匹配 where a = 1。失效情形:where a != 1
- 列前缀匹配
where name like "mike%",失效情形:where name like "%mike"
- 最左前缀匹配
这里最常见的是联合索引的情况。考虑列a,b,c,建立联合索引(a,b,c),请问哪些查询可以用到这个索引?
有效情形:查a,查a,b,查a,b,c(注意顺序)。
失效情形:查b,查c,查b,c;查a=1 and b>1 and c=1,此时只能用到索引a,中间不能有范围查询
- 索引不仅适用于where,也使用于order by子句
- 索引必须是独立的,不能是表达式的一部分。失效:where a+1 = 5,无法使用索引列a
- 一些巧妙使用索引的sql语句优化,我会放在下一篇sql语句查询优化讲
五、高性能的索引策略
我会以例子做引子来讲,这样比较清晰
- 前缀和后缀索引。用户表中的电子邮箱字段,如何查邮箱是163类型的记录?
这里我们可以使用"后缀索引",因为163邮箱的后缀字符都是以@163.com结尾,那么我们存储时其实可以将邮箱反转后存储,并以
邮箱字段的前若干位建一个前缀索引,add index idx_name((email(8)),这种情况遇到的也不多
- 多列索引
不要粗略的把where子句中的字段都建上索引。要懂得合并索引,前面的索引适用的例子已经讲了,这里不再重复。另外补充一点
将OR条件的2个列单独建索引,然后union后合并结果是一种更好的选择
- 索引列的顺序
多列索引的列顺序很重要,这一点在where子句中也会讲到。将能筛选掉最多(筛选后最少)的列优先作为前缀列,这只是一个
经验的做法,有很多具体的数据特征需要去分析
- 聚簇索引
当表有聚簇索引时,数据行实际上存放在索引的叶子页中。聚簇,意即数据行和相邻的key值紧凑的存储在一起。
- 覆盖索引
一种比较特殊的索引情况。select的列被所建的索引覆盖。那么查询时不必读取数据行,直接从索引中获取。
- 使用自增列主键
记住,不要使用非常随机的UUID值作为索引列,这种做法很不负责任,无论是插入时更新索引,还是查询时遍历索引都非常烂。
- 冗余索引,重复索引,以及不会使用的索引,出于我们的强迫症属性,大胆的删除掉吧
最后,关于索引可以讲很多很多,不论是理论的东西还是实际的分析,真的很多,笔者省去了4种常见索引的情景,有一些其实
根据索引类型的名称即可知道怎么用,比如唯一索引,就是保证这个索引下的列值必须唯一,比如不能重复的订单号,优惠券兑换码
之类的。其他的一些东西还是得多用客户端Navicat去explain,去试才能更好的选择和使用。
PS:格式还是没花时间排,感觉很乱*********
Mysql优化系列之索引性能的更多相关文章
- Mysql优化系列之查询性能优化前篇1
前言 这是优化系列的最后一篇的第1小篇,我们其实可以直接从sql怎么写讲起,why not?但是我还是决定花2个篇幅 问一些问题,带着几个问题循序渐进的往下走. 一个sql语句是怎么被执行的? sql ...
- Mysql优化系列之查询性能优化前篇2
接前一篇,这一篇主要总结下几个经常要用的命令 命令一:explain+sql mysql> explain select * from servers; +----+-------------+ ...
- Mysql优化系列之查询性能优化前篇3(必须知道的几个事实)
事实一:临时表没有任何索引 最常见的临时表莫过于在from子句中写子查询,遇到这种情况,Mysql会先将其查询结果放到一张临时表中, 然后将这个临时表当做普通表对待 事实二:执行计划优化 大多数的sq ...
- Mysql优化系列(2)--通用化操作梳理
前面有两篇文章详细介绍了mysql优化举措:Mysql优化系列(0)--总结性梳理Mysql优化系列(1)--Innodb引擎下mysql自身配置优化 下面分类罗列下Mysql性能优化的一些技巧,熟练 ...
- (转)MySQL优化系列
原文:http://blog.csdn.net/jack__frost/article/details/71194208 数据库,后端开发者必学,而且现在以MySQL居多.这个系列将系统化MySQL一 ...
- mysql 优化实例之索引创建
mysql 优化实例之索引创建 优化前: pt-query-degist分析结果: # Query 23: 0.00 QPS, 0.00x concurrency, ID 0x78761E301CC7 ...
- 0104探究MySQL优化器对索引和JOIN顺序的选择
转自http://www.jb51.net/article/67007.htm,感谢博主 本文通过一个案例来看看MySQL优化器如何选择索引和JOIN顺序.表结构和数据准备参考本文最后部分" ...
- Mysql优化系列(0)--总结性梳理
对于一个网站来说,在运行很长一段时间后,数据库瓶颈问题会越来越暴露出来.作为运维人员,对数据库做必要的优化十分重要!下面总结以往查阅到的以及自己工作中的一些优化操作经验,并根据OSI七层模型从下往上进 ...
- mysql优化-----多列索引的左前缀规则
索引优化策略 :索引类型 .1B-tree索引 关注的是:Btree索引的左前缀匹配规则,索引在排序和分组上发挥的作用. 注:名叫btree索引,大的方面看都用的二叉树.平衡树.但具体的实现上,各引擎 ...
随机推荐
- leetcood学习笔记-501- 二叉搜索树中的众数
题目描述: 方法一: class Solution: def findMode(self, root: TreeNode) -> List[int]: if not root: return [ ...
- Android中onTouch方法的执行过程以及和onClick执行发生冲突的解决办法
$*********************************************************************************************$ 博主推荐 ...
- bzoj1003题解
[题意分析] 给你一张无向图,固定起点和终点,除这两点外每个点都有可能消失一段时间(保证起点和终点相互可达),每天选择的路径总长,以及对路径的修改都有代价,求给定时间内最小代价保证起点终点始终连通. ...
- 记录下工作中用到的Linux命令
---恢复内容开始--- 常用的Linux命令以下命令在博主的开发中经常使用,因此在此做一记录,以做备忘! 1.查看java进程ps -ef|grep javaps aux|grep java lso ...
- NOIp2018集训test-9-17(pm)
T1记忆(memory) 我大概是只记忆只有七秒的金鱼吧.看了下以前的代码发现真的很简单,但是考场上只打了个暴力,虽然骗了88pt.就是枚举选的是哪个串,然后vis[i]表示选了i这些位能不能猜出它, ...
- [转]gulp打包工具总结
与grunt类似,gulp也是构建工具,但相比于grunt的频繁IO操作,gulp的流操作能更快更便捷地完成构建工作.gulp借鉴了Unix操作系统的管道(pipe)思想,前一级的输出,直接变成后一级 ...
- CF1265B Beautiful Numbers
题意 给一个长度为\(n\)的排列\(P\),求对于\(1\) 到 \(n\)中的每个数\(m\),是否能找到一段长度为\(m\)的区间使得区间内的数是一个\(1\)到\(m\)的排列. 输出一个\( ...
- iOS开发静态库冲突——如何查看静态库(.O)中方法名
1.bug产生 应用第三方静态库之后提示冲突错误: 2.bug分析 一般会提示哪两个库冲突: CameraShowGLView.o是自己创建的类编译生成的: libLechangeSDK.a是添加的静 ...
- jQuery 引入多个库文件冲突
index.html <head><meta http-equiv="Content-Type" content="text/html; charset ...
- 拾遗:Perl 正则表达式
三种正则模式: 匹配:m//,其中前缀 m 可省略 替换:s/// 转化:tr/// 操作符: =~:存在匹配项则返回结果 !~:不存在匹配项则返回结果 修饰符: i:忽略大小写,如:s/.../.. ...