一、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(一)——索引的更多相关文章

  1. 高性能MySQL之索引深入原理分析

    一.背景 我们工作中经常打交道的就是索引,那么到底什么是索引呢?例如,当一个SQL查询比较慢的时候,你可能会说给“某个字段加个索引吧”之类的解决方案. 总的来说索引的出现其实就是为了提高数据查询的效率 ...

  2. 高性能Mysql笔记 — 索引

    index优化 对于频繁作为查询条件的字段使用索引 注意索引字段类型的隐式转换,数据库类型和应用类型要一致 索引的种类 唯一索引,成为索引的列不能重复 单列索引,一个索引只包含一列 单列前缀索引,有些 ...

  3. 高性能MySQL笔记 第5章 创建高性能的索引

    索引(index),在MySQL中也被叫做键(key),是存储引擎用于快速找到记录的一种数据结构.索引优化是对查询性能优化最有效的手段.   5.1 索引基础   索引的类型   索引是在存储引擎层而 ...

  4. 高性能MySQL中的三星索引

    高性能MySQL中的三星索引 我对此提出了深深的疑问: 一星:相关的记录指的是什么??(相关这个词很深奥,“相关部门”是什么部门) 二星:如果建立了B-Tree(B+Tree)索引,数据就有序了.三星 ...

  5. 高性能mysql:创建高性能的索引

    本文系阅读<高性能MySQL>,Baron Schwartz等著一书中第五章 创建高性能的索引的笔记,索引是存储引擎用于快速找到记录的一种数据结构. 索引对于良好的性能非常关键,尤其是当表 ...

  6. 高性能mysql——高性能索引策略

    <高性能MySQL>读书笔记 一. 索引的优点 1. 索引可以让服务器快速定位到表的指定位置,大大减少了服务器需要扫描的数量: 2. 最常见的B-Tree索引按照顺序存储数据,可以用来做o ...

  7. 好书推荐之Mysql三剑客 :《高性能Mysql》、《Mysql技术内幕》、《数据库索引设计与优化》

    Mysql三剑客系列书籍: 大佬推荐 首先推荐<高性能 MySQL>,这本书是 MySQL 领域的经典之作,拥有广泛的影响力.不但适合数据库管理员(DBA)阅读,也适合开发人员参考学习.不 ...

  8. 高性能Mysql主从架构的复制原理及配置详解

    温习<高性能MySQL>的复制篇. 1 复制概述 Mysql内建的复制功能是构建大型,高性能应用程序的基础.将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台 ...

  9. 1121高性能MySQL之运行机制

    本文来自于拜读<高性能MySQL(第三版)>时的读书笔记作者:安明哲转载时请注明部分内容来自<高性能MySQL(第三版)> MySQL的逻辑构架 MySQL服务器逻辑架构 最上 ...

随机推荐

  1. flume安装使用+根据数据源分类

    安装搭建: 1)解压下载的flume(安装jdk1.6及其以上) 2)在conf文件夹里面建立example.conf文件 #example.conf:单节点Flume配置 #命名Agent a1的组 ...

  2. 怎么用命令行把apk安装到移动设备上?

    1.移动设备通过USB连接电脑 2.执行命令adb install [apk文件的路径]

  3. Scala 系列(十一)—— 模式匹配

    一.模式匹配 Scala 支持模式匹配机制,可以代替 swith 语句.执行类型检查.以及支持析构表达式等. 1.1 更好的swith Scala 不支持 swith,可以使用模式匹配 match.. ...

  4. kafka Enabling Kerberos Authentication

    CDK 2.0 and higher Powered By Apache Kafka supports Kerberos authentication, but it is supported onl ...

  5. 修改host文件加速访问github

    修改本地电脑系统 hosts 文件C:\Windows\System32\drivers\etc,直接在最后加入以下代码 192.30.253.112 github.com 192.30.253.11 ...

  6. String.Operation

    // 字符串切割 StringField.Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);

  7. CodeForces 1228F One Node is Gone

    洛谷题目页面传送门 & CodeForces题目页面传送门 给定一棵树\(T=(V,E),|V|=2^n-2,|E|=2^n-3\),输出所有的\(x\),使得存在一棵满二叉树\(T'\),将 ...

  8. C++ 中的静态成员函数与静态成员变量

    于CSDN 2014-01-17 与静态数据成员一样,静态成员函数是类的一部分,而不是对象的一部分.如果要在类外调用公用的静态成员函数,要用类名和域运算符"∷".如Box∷volu ...

  9. ajax往后台传值的一些方式

    $('#del1').click(function () { $.ajax({ url: 'http://localhost:8089/test1', data: {a: 1, b: 2}, type ...

  10. mac下比较好用的svn软件,SVN客户端CornerStone 2.7.10 破解版

    一.已经破解,可以直接使用. dmg文件无密码,也不需要注册机.直接使用即可     二. 界面... 三.添加repository 点击左侧栏中REPOSITORY那一栏的+选择添加reposito ...