《高性能MySQL》阅读-高性能索引策略
【四非凡人】:才德兼备是圣人,无才有德是贤人,
有才无德是小人,才德俱失是庸人。
高性能的索引策略
- 独立的列
① 是指索引列不能是表达式的一部分,也不能是函数的参数(MySQL8.0版本之后可以有函数索引了) - 前缀索引和索引的选择
① 有时索引列字符非常的长,这会让索引变得大且慢
② 通常可以选择使用索引的部分字符,这样可以大大节约索引空间,这样同样也降低了索引的选择性
**索引的选择性:**不重复的索引值(也称为基数,cardinality)和数据表记录总数(#T)的比值,范围从1/(#T)到1之间。索引的选择性越高则查询效率越高,因为选择性高的索引可以让MySQL在查找时过滤掉更多的行,唯一索引的选择性是1 ,这是最好的索引选择性,性能也是最好的
③ 一般情况下某个列前缀的选择性也是足够高的,足以满足查询性能。对于BLOB、TEXT、或者很长的VARCHAR类型的列,必须使用前缀索引,因为MySQL不允许索引这些列的完整长度
④ 要选择足够长的前缀以保证较高的选择性,同时又不能太长(以便节约空间)。前缀应该足够长,以使得前缀索引的选择性接近于索引整个列。换句话说,前缀的“基数”应该接近于完整列的“基数” - 多列索引
- 在多个列行建立独立的单列索引,大部分情况下并不能提高MySQL的查询性能。MySQL5.0和更新版本引入了一种“合并索引” 的策略,一定程度上可以使用表上的多个单列索引来定位指定的行。
- 合并索引的变种:OR条件的联合,AND条件的相交,组合前两种情况的联合及相交。
- 糟糕的索引:
① 当出现服务器对多个索引 做相交操作时,通常意味着需要一个包含所有相关列的多列索引,而不是多个独立的单列索引
② 当服务器需要对多个索引联合操作时,通常需要耗费大量CPU和内存资源在算法的缓存、排序和合并操作上
- 选择合适的索引列顺序
- 在一个多列B-Tree索引中,索引列的顺序意味着索引首先按照最左列进行排序,其次是第二列,等等
- 选择性最高的列放到索引最前列。
- 聚簇索引
- 聚簇索引并不是一种单独的索引类型,而是一种数据存储方式。 具体的细节依赖于其实现方式,但InnoDB的聚簇索引实际上在同一个结构中保存了B-Tree索引和数据行
- 当表有聚簇索引时,它的数据行实际上存储在索引的叶子页中。术语“聚簇”表示数据行和相邻的键值紧凑的存储在一起。
- 因为无法同时把数据行存放在两个不同的地方,所以一个表只能有一个聚簇索引
- 因为是存储引擎负责实现索引,因此不是所有的存储引擎都支持聚簇索引
- InnoDB通过主键聚集数据,如果没有主键,InnoDB会选择一个唯一的非空索引代替。如果这样的索引也没有,InnoDB会隐式定义一个主键来作为聚簇索引;
- InnoDB只聚集在同一个页面中的记录,包含相邻键值的页面可能会相聚很远
- 聚集数据的优点:
① 可以把数据保存在一起
② 数据访问更快。聚簇索引将索引和数据保存在同一个B-Tree中,因此从聚簇索引中获取数据通常比在非聚簇索引中查找的要快
③ 使用覆盖索引扫描的查询可以直接使用页节点中的主键值 - 聚簇索引的缺点
① 聚簇数据最大限度地提高了I/O密集型应用的性能,但如果数据全部都放在内存中,则访问的顺序就没有那么重要了,聚簇索引也就没有什么优势了
② 插入速度严重依赖于插入顺序。
③ 更新聚簇索引列的代价很高。因为会枪支罪InnoDB将每个被更新的行移动到新的位置
④ 基于聚簇索引的表在插入新行,或者主键被更新导致需要移动行的时候,可能面临“页分裂”的问题。当行的主键值要求必须将这一行插入到某个已满的页中时,存储引擎会将该页分裂成两个页面来容纳该行,这就是一次页分裂操作,页分裂会导致表占用更多的磁盘空间
⑤ 聚簇索引可能导致全表扫描变慢,尤其是行比较稀疏,或者由于页分裂导致数据存储不连续的时候
⑥ 二级索引(非聚簇索引)可能比想象的要更大,因为二级索引的叶子节点包含了引用列的主键列
⑦ 二级索引查找需要两次索引查找,而不是一次
《高性能MySQL》阅读-高性能索引策略相关推荐
- 读薄《高性能MySql》(三)索引优化
读薄<高性能MySql>(一)MySql基本知识 读薄<高性能MySql>(二)Scheme与数据优化 读薄<高性能MySql>(三)索引优化 读薄<高性能M ...
- 高性能mysql学习笔记--索引
高性能mysql 五:索引 1,B-Tree索引 全值匹配:匹配所有列. 匹配最左前缀:只使用索引的第一列. 匹配列前缀:只使用索引的第一列. 匹配范围值:只使用索引的第一列. 精确匹配某一列并范围匹 ...
- 高性能Mysql——创建高性能索引详解
索引(在MySQL中也叫做"键(key)")是存储引擎用于快速找到记录的一种数据结构.这是索引的基本功能,除此之外,本章还将讨论索引其他一些方面有用的属性. 索引对于良好的性能非常 ...
- 高性能mysql 聚簇索引,高性能MySQL笔记-第5章Indexing for High Performance-005聚集索引...
一.聚集索引介绍 1.什么是聚集索引? InnoDB's clustered indexes actually store a B-Tree index and the rows together i ...
- 读薄《高性能MySql》(四)查询性能优化
读薄<高性能MySql>(一)MySql基本知识 读薄<高性能MySql>(二)Scheme与数据优化 读薄<高性能MySql>(三)索引优化 读薄<高性能M ...
- MySQL之高性能的索引策略(索引优化)
高性能的索引策略 高效地选择和使用索引有很多种方式,其中有些是针对特殊案例的优化方法,有些则是针对特定行为的优化. 独立的列 如果查询中的列不是独立的,则MySQL就不会使用索引."独立的列 ...
- mysql like 多个条件_MySQL高性能索引策略
索引类型 从物理存储角度: 聚集索引 InnoDB 叶节点包含了完整的数据记录.这种索引叫做聚集索引.因为InnoDB的数据文件本身要按主键聚集,所以InnoDB要求表必须有主键(MyISAM可以没有 ...
- 高性能的MySQL(5)索引策略
一.索引的优点 1.索引可以大大减少服务器需要扫描的数据量 2.索引可以帮助服务器避免排序和临时表. 3.索引可以将随即I/O变为顺序I/O 二.索引策略 1.独立的列 独立的列是指索引列不能是表达式 ...
- 【mysql】--高性能索引策略(359)
如何高效的使用索引: 1 独立的列-->将单独列放在比较符号的一侧: where acrot_id + 1 = 5: error 2 索引的选择性: 不重复的索引值 : 数据表记录总数 ,唯一索 ...
最新文章
- React Native之箭头函数和延展操作符(...)
- 适用于System Center 2016所需前期准备工作
- 磁盘显示执行页内操作时的错误要如何找到资料
- 我要做一个什么样的程序员
- 计算机操作系统_计算机理论(操作系统概念及常见操作系统类型)
- simulink设计PID控制器及其封装详解
- 安卓期末作品小项目_北京部编版八年级上册语文期末试卷
- jdk11默认使用的垃圾回收器是G1
- 封装案例-完成开火方法
- 算法分类整理+模板①:矩阵快速幂
- linux vlc 串流_linux下VLC的安装
- python作品讲解_python实例作品
- 电信运营商推出1号2卡的应用设计
- Win10设置文件夹背景色
- linux安装i3wm桌面环境,ArchLinux基本安装后安装i3wm基本环境
- 只做了delete操作,为啥 ORACLE-01466表定义已更改
- 消金主流市场外的灰色地带:vivo应用商店聚集大量“伪现金贷平台”
- 解读智慧农业未来发展
- 488 祖玛游戏 python
- Inno Setup 系列之卸载删除文件