高性能MySQL(一)——索引
一、mysql索引分类
单值索引:一个索引只包含单个列,一个表可以有多个单列索引
唯一索引:索引列的值必须唯一,但允许有空值
复合索引:一个索引包含多个列
基本语法:
创建:1.CREATE [UNIQUE] indexName ON mytable (columnname(length));——如果是CHAR,VARCHAR类型,length可以小于字段实际长度,如果是BLOB和TEXT类型,必须指定length。
2.ALTER mytable ADD [UNIQUE] INDEX [indexName] ON (columnname(length))
删除:DROP INDEX [IndexName] ON mytable
查看:SHOW INDEX FROM table_name\G
二、mysql索引结构
B+Tree索引、Hash索引、full-text全文索引、(空间数据索引)R-Tree
三、B+Tree索引的查询类型
1、全值匹配:和索引中的所有列进行匹配
2、匹配最左前缀
3、匹配列前缀
4、匹配范围值
5、精确匹配某一列并范围匹配另外一列
6、只访问索引的查询
同理:B+Tree索引限制
1、如果不是按照索引的最左列开始查找,则无法使用索引。
2、不能跳过索引的列
3、如果查询中有个列的范围查询,则其右边所有列都无法使用索引优化查找。
四、索引的优点
1、索引大大减少了服务器需要扫描的数据量。
2、索引可以帮助服务器避免排序和临时表。
3、索引可以将随机I/O变成顺序I/O。
五、索引策略
1、前缀索引和索引选择性。
选择足够长的前缀以保证较高的选择性,不能太长(以便节省空间),但得足够长,使得前缀索引的选择性接近于索引这个列。
2、选择合适的索引列顺序。
当不考虑排序和分组时,将选择性最高的列放在前面,此时索引的作用只是优化WHERE条件的查找。
六、聚簇索引
聚簇索引不是索引类型,而是数据存储方式。InnoDB的聚簇索引——同一结构中保存了B+Tree索引和数据行。
当表有聚餐索引时,它的数据行实际上存放在索引的叶子页中。
如果没有定义主键,InnoDB会选择一个唯一的非空索引替代。如果没有这样的索引,InnoDB会隐式的定义一个主键来作为聚簇索引。
聚簇索引的优点:
1、可以把关联数据保存在一起。
2、数据访问更快。聚簇索引将索引和数据保存在同一个B+Tree中,因此从聚簇索引中获取数据通常比非聚簇索引中查找要快。
3、使用覆盖索引扫描的查询可以直接使用叶节点的主键值。
注意:二级索引需要两次索引查找:二索引叶子节点保存是行的主键值。先B-Tree查主键值,再B-Tree聚簇索引查对应的行。
页分裂:一个数据页满了,按照B+Tree算法,新增加一个数据页,叫做页分裂,会导致性能下降。空间利用率降低大概50%。当相邻的两个数据页利用率很低的时候会做数据页合并,合并的过程是分裂过程的逆过程。
七、覆盖索引
如果一个索引包含(覆盖)所有需要查询的字段的值——覆盖索引。
优点:
1、索引条目通常小于书数据行大小,如果只需要读取索引,那mysql就会极大减少数据访问量。
2、因为索引是按照列值顺序存储的,所以对于I/O密集型的范围查找会比随机从磁盘中读取每一行的数据I/O要少得多。
3、由于InnoDB的聚簇索引,覆盖索引对InnoDB表特别有用。InnoDB的二级索引在叶子节点保存了行主键值,如果二级索引能够覆盖查询,那么就避免对主键索引的二次查询。
索引下推:在MySQL5.6之前,只能从根据最左前缀查询到ID开始一个个回表。到主键索引上找出数据行,再对比字段值。MySQL5.6引入的索引下推优化,可以在索引遍历过程中,对索引中包含的字段先做判断,直接过滤掉不满足条件的记录,减少回表次数。
八、索引扫描做排序
mysql有两种方式可以生成有序的结果:通过排序操作;或者按索引顺序扫描;如果EXPLAIN出来的type列的值为“index”,则说明mysql使用了索引扫描来排序。
mysql可以使用同一索引即满足排序,有用于查找行。因此,设计索引尽可能满足这两种任务。
只有当索引的列顺序和ORDER BY字句的顺序完全一样,并且所有列的排序方向(倒序或正序)都一样,mysql才能使用索引对结果排序。
九、创建索引建议
1、主键自动建立唯一索引
2、频繁作为查询条件的字段
3、查询中与其他表关联的字段,外键关系
4、频繁更新的字段不适合
5、查询中排序的字段(见八)
6、查询中统计或者分租。
十、索引使用注意
1、全值匹配
2、最佳左前缀法则:索引多列,要遵守最左前缀法则,查询从最左开始,不跳列
3、不在索引上做任务操作(计算、函数、(手动或自动)类型转化),会导致索引失效全表扫描
4、尽量使用覆盖索引,减少select *
5、mysql在使用不等于(!=或<>)无法使用索引
6、is null,is not null无法使用索引
7、like以通配符开头,索引失效
8、字符串不加单引号,索引失效
9、少用or,用它来连接时索引会失效。
高性能MySQL(一)——索引的更多相关文章
- 高性能MySQL之索引深入原理分析
一.背景 我们工作中经常打交道的就是索引,那么到底什么是索引呢?例如,当一个SQL查询比较慢的时候,你可能会说给“某个字段加个索引吧”之类的解决方案. 总的来说索引的出现其实就是为了提高数据查询的效率 ...
- 高性能Mysql笔记 — 索引
index优化 对于频繁作为查询条件的字段使用索引 注意索引字段类型的隐式转换,数据库类型和应用类型要一致 索引的种类 唯一索引,成为索引的列不能重复 单列索引,一个索引只包含一列 单列前缀索引,有些 ...
- 高性能MySQL笔记 第5章 创建高性能的索引
索引(index),在MySQL中也被叫做键(key),是存储引擎用于快速找到记录的一种数据结构.索引优化是对查询性能优化最有效的手段. 5.1 索引基础 索引的类型 索引是在存储引擎层而 ...
- 高性能MySQL中的三星索引
高性能MySQL中的三星索引 我对此提出了深深的疑问: 一星:相关的记录指的是什么??(相关这个词很深奥,“相关部门”是什么部门) 二星:如果建立了B-Tree(B+Tree)索引,数据就有序了.三星 ...
- 高性能mysql:创建高性能的索引
本文系阅读<高性能MySQL>,Baron Schwartz等著一书中第五章 创建高性能的索引的笔记,索引是存储引擎用于快速找到记录的一种数据结构. 索引对于良好的性能非常关键,尤其是当表 ...
- 高性能mysql——高性能索引策略
<高性能MySQL>读书笔记 一. 索引的优点 1. 索引可以让服务器快速定位到表的指定位置,大大减少了服务器需要扫描的数量: 2. 最常见的B-Tree索引按照顺序存储数据,可以用来做o ...
- 好书推荐之Mysql三剑客 :《高性能Mysql》、《Mysql技术内幕》、《数据库索引设计与优化》
Mysql三剑客系列书籍: 大佬推荐 首先推荐<高性能 MySQL>,这本书是 MySQL 领域的经典之作,拥有广泛的影响力.不但适合数据库管理员(DBA)阅读,也适合开发人员参考学习.不 ...
- 高性能Mysql主从架构的复制原理及配置详解
温习<高性能MySQL>的复制篇. 1 复制概述 Mysql内建的复制功能是构建大型,高性能应用程序的基础.将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台 ...
- 1121高性能MySQL之运行机制
本文来自于拜读<高性能MySQL(第三版)>时的读书笔记作者:安明哲转载时请注明部分内容来自<高性能MySQL(第三版)> MySQL的逻辑构架 MySQL服务器逻辑架构 最上 ...
随机推荐
- Haskell-chp01
-- 函数名首字母必须小写,可以包含 '来表示该函数严格求值版本(与惰性求值相对) doubleMe x = x + x doubleUs x y = doubleMe x + doubleMe y ...
- python实现队列结构
# -*- coding:utf-8 -*- # __author__ :kusy # __content__:文件说明 # __date__:2018/10/8 13:49 class MyQueu ...
- 在spring中使用Hibernate5
目录 1. Overview 2. Spring Integration 3. Maven Dependencies 4. Configuration 4.1. Using Java Configur ...
- 关于 Windows to go
1. 在宿主计算器的操作系统中访问 Windows to go 的磁盘 如题,如果需要在宿主计算器的操作系统中访问 Windows to go 的U盘(移动硬盘)中的文件,只需要打开磁盘管理,“更改驱 ...
- ndk-build官方使用说明
ndk-build 脚本可用于编译采用 NDK 基于 Make 的编译系统的项目.此外,我们还针对 ndk-build 使用的 Android.mk和 Application.mk 配置提供了更具体的 ...
- opencv常用数据结构
2019/10/29 1.Mat 成员函数:cols.rows.channels.ptr获取任意行的首地址.at处理像素 2.InputArray/OutArray相当于Mat 2019/11/4 1 ...
- FindWindow和FindWindowEx函数使用
FindWindow( lpClassName, {窗口的类名} lpWindowName: PChar {窗口的标题} ): HWND; {返回窗口的 ...
- .net Dapper 实践系列(5) ---事务编辑(Layui+Ajax+Dapper+MySQL)
目录 写在前面 实践步骤 写在前面 上一小节,我们总结了根据Id查询多表数据,最后返回Json对象给前台的例子.接下来,在这一小节我们要实现多表编辑的操作. 实践步骤 因为上一小节以及创建了Edit视 ...
- C#读写设置修改调整UVC摄像头画面-增益
有时,我们需要在C#代码中对摄像头的增益进行读和写,并立即生效.如何实现呢? 建立基于SharpCamera的项目 首先,请根据之前的一篇博文 点击这里 中的说明,建立基于SharpCamera的摄像 ...
- ELK部署配置使用记录
为什么要用ELK: 一般我们需要进行日志分析场景:直接在日志文件中 grep.awk 就可以获得自己想要的信息.但在规模较大的场景中,此方法效率低下,面临问题包括日志量太大如何归档.文本搜索太慢怎么办 ...