[MySQL-笔记]创建高性能索引
索引,MySQL中也叫“键”,是存储引擎中用于快速找到记录的一种数据结构,具体的工作方式就像书本中的索引一样,但是具体的实现方式会有差别。
一.索引分类
B-Tree索引:
优点:
- MyISAM中,索引根据数据的物理位置引用被索引的行,InnoDB中根据主键引用被索引的行。
- B-Tree索引能够加快访问数据的速度,因为存储引擎不再需要进行全表扫描来获取需要的数据,而是从索引的根节点开始进行搜索。
- B-Tree对索引列是顺序组织存储的,所以很适合查找范围数据。
- 一般来说,B-Tree可以按照某种方式查找到值,那么也可以用这种方式排序
限制:
- 如果不是按照索引的最左列开始查到,则无法使用索引
- 不能跳过索引中的列
- 如果查询中有某个列的范围查询,则其右边所有的列都无法使用索引优化查找。
哈希索引:
哈希索引基于哈希表实现,只有精确匹配的索引所有列的查询才有效
优点:
- 非常快
限制:
- 哈希索引只包含哈希值和行指针,而不存储字段值,所以不能使用索引中的值来避免读取行。
- 哈希索引不是按照索引值顺序存储的,所以不能用于排序。
- 哈希索引不支持部分索引列匹配查找。
- 哈希索引只支持等值比较查询。
- 哈希冲突很多的话,一些索引维护操作的代价会很高。
二.索引的优点
最常见的是B-Tree索引,按照顺序存储数据,所以可以用来做ORDER BY和GROUP BY操作。因为数据是有次序的,所以B-Tree也就会将相关的列值存储在一块。由于索引中存储了实际的列值,所以某些查询只使用索引就可以完成全部查询。
1.索引大大减少了服务器需要扫描的数据量
2.索引可以帮助服务器避免排序和临时表
3.索引可以将随机I/O变为顺序I/O.
三.高性能索引策略
1) 独立的列
独立的列是指索引列不能是表达式的一部分,也不能是函数的一部分
2)前缀索引和索引选择性
诀窍在于要选择足够长的索引以保证高的索引选择性,但是又不能太长(节约空间)。
3)多列索引
首先“把where条件里面的列都建上索引”是错误的。
如果在一个查询用使用两个单列索引,在老版本的MySQL中会导致全表扫描,在新版本中,查询可以使用多个单列索引,并将结果合并。
这种算法有三个变种:
- OR条件的联合(union)
- AND条件的相交(intersection)
- 以前OR和AND的组合
索引合并策略更多的说明了索引建的很糟糕:
- 当出现服务器对多个索引做相交操作时,通常意味着需要一个包含所有相关列的多列索引,而不是多个独立的单列索引
- 当服务器需要对多个索引做联合操作时,通常需要耗费大量的CPU和内存资源在算法的缓存/排序/合并操作上。
4)选择合适的索引列顺序
多列索引的顺序至关重要
有一个经验法则:当不需要考虑排序和分组时候,将选择性高的列放在前面通常是很好的。
5) 聚簇索引
聚簇索引不是一种单独的索引类型,而是一种数据存储方式,实际上,InnoDB聚簇索引在同一个结构中保存了B-Tree索引和数据行。当表有聚簇索引时候,它的数据行实际上放在索引的叶子页中。“聚簇”,表示数据行和键值紧凑的存储再一起。
优点:
- 可以把相关数据保存在一起,减少磁盘I/O
- 数据访问更快,因为索引和数据保存在同一个B-Tree中
- 使用覆盖索引扫描查询可以直接使用页节点的主键值。
缺点:
- 聚簇索引最大限度的提高了I/O密集型应用的性能,但是如果数据都在内存中,聚簇索引就没有优势了
- 插入速度严重依赖插入顺序
- 更新聚簇索引代价很高
- 在插入新行,或者主键更新需要移动行时候,可能导致页分裂。
- 导致全表扫描变慢,尤其是行稀疏的时候,或者由于页分裂导致数据存储不连续时候
- 二级所以可能比想象中更大,因为二级索引的叶子节点包含了主键值
- 二级索引访问需要两次索引查找,而不是一次。
6)覆盖索引
如果一个索引包含(覆盖)了所有需要查询的字段的值,那么就是覆盖索引
覆盖索引必须要存储索引列的值,而哈希索引,空间索引,全文索引都不存储索引列的值,只有B-Tree可以
MySQL不能再索引中执行LIKE操作,这是底层API的限制,MySQL只能提取数据行的值而不是索引的值来比较。
为了利用覆盖索引,我们可以利用一种叫延迟关联的技巧
7) 使用索引扫描来做排序
参考资料:高性能MySQL第五章
[MySQL-笔记]创建高性能索引的更多相关文章
- php面试专题---16、MySQL创建高性能索引考点
php面试专题---16.MySQL创建高性能索引考点 一.总结 一句话总结: 注意:只写精品 1.索引的基础? 类似书籍的目录:索引类似于书籍的目录,要想找到一本书的某个特定主题,需要先查找书的目录 ...
- Mysql如何创建短索引(前缀索引)
Mysql如何创建短索引 为什么要用短索引 有时需要索引很长的字符列,它会使索引变大并且变慢.一个策略就是模拟哈希索引.但是有时这也不够好,那么应该怎么办呢?通常可以索引开始的几个字符,而不是全部值, ...
- 高性能mysql:创建高性能的索引
本文系阅读<高性能MySQL>,Baron Schwartz等著一书中第五章 创建高性能的索引的笔记,索引是存储引擎用于快速找到记录的一种数据结构. 索引对于良好的性能非常关键,尤其是当表 ...
- Mysql优化之创建高性能索引(二)
1.索引的优点 索引可以让服务器快速地定位到表的指定位置.总结下来有三大优点: 索引大大减少了服务器需要扫描的数据量 索引可以帮助服务器避免排序和临时表 索引可以将随机I/O变为顺序I/O 2.高性能 ...
- MySQL 创建高性能索引
索引是存储引擎用于快速找到记录的一种数据结构.除了加速查找,索引在其他方面也有一些有用的属性.索引对于良好的性能非常关键.尤其是当表中的数据量越来越大时,索引对性能的影响愈发重要.在数据量较小且负载较 ...
- MySQL创建高性能索引
参考<高性能MySQL>第3版 1 索引基础 1.1 索引作用 在MySQL中,查找数据时先在索引中找到对应的值,然后根据匹配的索引记录找到对应的数据行,假如要运行下面查询语句: 如果在u ...
- Mysql优化之创建高性能索引(一)
1.索引基础 索引对于良好的性能非常关键.尤其是当表中的数据量越来越大时,索引对性能的影响愈发重要.但是不恰当的索引随着数据量的增加,也会使整个数据库的性能下降. 举个例子: ; 如果在id上建立索引 ...
- 《高性能MySQL》——第五章创建高性能索引
1.创建索引基本语法格 在MySQL中,在已经存在的表上,可以通过ALTER TABLE语句直接为表上的一个或几个字段创建索引.基本语法格式如下: ALTER TABLE 表名 ADD [UNIQUE ...
- PHP面试 MySQL创建高性能索引考点
MySQL索引 MySQL索引的基础和类型 索引的基础:索引类似于书籍的目录,要想找到一本书的某个特定篇章,需要查找书的目录,定位对应的页码 存储引擎使用类似的方式进行数据查询,先去索引当中找到对应的 ...
随机推荐
- bzoj 2342 [Shoi2011]双倍回文(manacher,set)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2342 [题意] 求出形如w wR w wR的最长连续子串. [思路] 用manache ...
- 【总结】前端框架:react还是vue?
之前写了一篇前端框架的大汇总,主要介绍了当下主流的框架和其特性.最近除了bootstrap,就属react和vue最为热门,这篇就主要拿这两个框架来做一下详细对比. 究竟如何正确使用?作为小白的我们从 ...
- windebug常用命令
使用~查看所有线程 切换到一号线程:~1s 查看所有线程的托管堆栈 ~* e!clrstack 怎么查看,当前线程下,变量的信息? 对于托管代码而言,最核心的命令就是!do(dump object的 ...
- golang的json序列化
json就是简单的数据交换格式,语法类似javascript的对象和列表,是最常见的后端和运行在网页上的js之间的通信格式. encoding: 编码json数据需要使用到Marshal()函数. f ...
- Spring4笔记9--Spring的事务管理(AOP应用的例子)
Spring的事务管理: 事务原本是数据库中的概念,在 Dao 层.但一般情况下,需要将事务提升到业务层,即 Service 层.这样做是为了能够使用事务的特性来管理具体的业务. 在 Spring ...
- mysql5.7.10 源码编译安装记录 (centos6.4)【转】
一.准备工作 1.1 卸载系统自带mysql 查看系统是否自带MySQL, 如果有就卸载了, 卸载方式有两种yum, rpm, 这里通过yum卸载 rpm -qa | grep mysql //查看系 ...
- C# 所生成项目的处理器架构“MSIL”与引用“Oracle.DataAccess, Version=4.112.3.0, Culture=neutral, PublicKeyToken=89b483f429c47342, processorArchitecture=x86”的处理器架构“x86”不匹配。这种不匹配可能会导致运行时失败。
这个问题一般都是Oracle.DataAccess的版本不兼容问题造成的. 解决办法: 1.把Oracle.DataAccess.dll文件拿到C盘或D盘的安装文件的地方进行搜索. 2.会出现在pro ...
- java基础63 JavaScript中的Number、Math、String、Date对象(网页知识)
本文知识点(目录): 1.Number对象 2.Math对象 3.String对象 4.Date对象 (日历例子) 1.Number对象 1.1.Number对象的创建方式 方式1: ...
- python3 安装
Centos7 安装python3 #安装sqlite-devel yum -y install sqlite-devel #安装依赖 yum -y install make zlib zlib-de ...
- Codeforces 580D Kefa and Dishes(状态压缩DP)
题目链接:http://codeforces.com/problemset/problem/580/D 题目大意:有n盘菜每个菜都有一个满意度,k个规则,每个规则由x y c组成,表示如果再y之前吃x ...