一.聚簇索引

1.聚簇索引并不是一种单独所以,而是一种数据储存方式。

InnoDB 的聚簇索引实际上在同一结构中保存了B-Tree 索引和数据行。

2.当表有聚簇索引时,它的数据行实际上存放在索引的叶子页中。“聚簇”表示数据行和相邻的键值紧凑的储存在一起。

3.对应InnoDB 来说如果表没有定义主键,会选择一个唯一的非空索引代替。如果没有这样的索引InnoDB 会隐式定义一个主键来作为聚簇索引。InnoDB 只聚集在同一页面中的记录。

4.聚簇索引的优势:

(1)可以把相关数据保存在一起。

(2)数据访问更快。数据和索引保存在同一个 B-Tree 。

(3)使用覆盖索引扫描的查询可以直接使用页节点的主键值

5.聚簇索引的缺点:

(1)聚簇索引最大的提高了I/O密集型应用的性能,但如果数据全部都放到内存中,则数据的顺序就没有那么重要了,聚簇索引也就没什么优势了。

(2)插入速度严重依赖插入顺序。按照主键插入的方式是InnoDB 速度最快的方式,但如果不是按照主键顺序加载数据,那么在加载后最好使用OPTIMIZE TABLE 命令重新组织一2下表

(3)更新聚簇索引列的代价很高。因为会强制InnoDB 将每个被更新的行移动到新的位置

6.二级索引

主键索引的叶子节点存的是整行数据,在InnoDB 里,主键索引也被称为聚簇索引

非主键索引的叶子节点内容是主键的值。在InnoDB 里。非主键索引也被称为二级索引。

如:select* from order where user_id=3; user_id是普通索引。则会先搜索user_id 的索引树,得到id=5,再到id 索引树搜索一次,这个过程就是 “回表”。

也就是说非主键索引需要查询2次

二.覆盖索引

1.mysql 可以使用索引直接来获取列的数据,这样就可以不再需要读取数据行。

如果索引的叶子节点中已经包含要查询的数据,那么还有什么必要再回表查询呢?如果一个索引包含(覆盖)所有要查询的字段的值,那么就称为“覆盖索引”

2.覆盖索引可以提高查询的性能,不需要会表,好处是:

(1)索引条目通常小于数据行,如果只需读取索引,那么mysql 就会减少访问量

(2)索引是按照列值顺序存储的,索引I/O 密集型的范围查询会比随机从磁盘读取每一行数据的I/O 要少得多

(3)一些存储引擎如MyISAM 在内存只缓存索引,数据则依赖操作系统来缓存,因此要访问数据需要一次系统调用,这可能导致严重的性能问题,尤其是那些系统调用占了数据访问中最大开销的场景

(4)InnoDB 的聚簇索引,覆盖索引对InnoDB 表的特别有用。InnoDB 的二级索引在叶子节点保存了行的主键值,所以如果二级主键能够覆盖查询,则可以避免对主键索引的二次查询。

3

select id from order where user_id between 1 and 3

这时候只需要查ID 的值,而ID 已经在user_id 索引树上,因此可以直接提供查询结果,不需要回表。

select * from order where user_id between 1 and 3

一旦用了select *,就会有其他列需要读取,这时在读完index以后还需要去读data才会返回结果。

这两种处理方式性能差异非常大,特别是返回行数比较多,并且读数据需要 I/O 的时候,可能会有几十上百倍的差异。因此建议根据需要用select *

ps:文章参考《高性能mysql》一书

mysql 聚合索引和聚簇索引_MySQL 聚簇索引 和覆盖索引相关推荐

  1. [MySQL] 索引与性能(3)- 覆盖索引

    覆盖索引是指索引的叶子节点已包含所有要查询的列,因此不需要访问表数据,能极大地提高性能.覆盖索引对InnoDB的聚簇索引表特别有用,因为可以避免InnoDB二级索引的二次查询.MySQL里只有B树索引 ...

  2. mysql 聚簇索引和非聚簇索引_MySQL 聚簇索引 二级索引 辅助索引(上两期中奖名单)...

    阅读文本大概需要3分钟. MySQL中每个表都有一个聚簇索引( clustered index ),除此之外的表上的每个非聚簇索引都是二级索引,又叫辅助索引( secondary indexes ). ...

  3. mysql 聚簇索引和非聚簇索引_MySql聚簇索引与非聚簇索引的区别

    通常情况下,建立索引是加快查询速度的有效手段.但索引不是万能的,靠索 引并不能实现对所有数据的快速存取.事实上,如果索引策略和数据检索需求严重不符的话,建立索引反而会降低查询性能.因此在实际使用当中, ...

  4. mysql主键和聚簇索引_MySQL 聚簇索引一定是主键吗

    数据库表的索引从数据存储方式上可以分为聚簇索引和非聚簇索引(又叫二级索引)两种. use myTest; drop table if exists t1; CREATE TABLE `t1` ( `i ...

  5. mysql聚合函数count用法_MySQL中聚合函数count的使用和性能优化技巧

    本文的环境是Windows 10,MySQL版本是5.7.12-log 一. 基本使用 count的基本作用是有两个: 统计某个列的数据的数量: 统计结果集的行数: 用来获取满足条件的数据的数量.但是 ...

  6. mysql的表是聚集索引组织表_Mysql的Innodb引擎索引总结

    索引的目的是什么? 答:数据库添加索引的目的是为了加快查询速度. 索引的的数据结构是什么? 答:(这里的B是balance)B+树来存储索引,B+树类似于二叉树. B+树是怎么查找数据的? 答:B+树 ...

  7. mysql索引优化规则_Mysql优化选择最佳索引规则

    索引的目的在于提高查询效率,其功能可类比字典,通过该索引可以查询到我们想要查询的信息,因此,选择建立好的索引十分重要,以下是为Mysql优化选择最佳索引的方法步骤: 1. 首先列出查询中所有使用的表, ...

  8. mysql行锁同索引键问题_mysql 锁问题 (相同索引键值或同一行或间隙锁的冲突)

    1.使用相同索引键值的冲突 由于mysql 的行锁是针对索引加的锁,不是针对记录加的锁,所以虽然是访问不同行的记录,但如果是使用相同的索引键,是会出现锁冲突的.设计时要注意 例如:city表city_ ...

  9. mysql数据库存储引擎和索引的描述_Mysql InnoDB引擎的索引与存储结构详解

    前言 在Oracle 和SQL Server等数据库中只有一种存储引擎,所有数据存储管理机制都是一样的. 而MySql数据库提供了多种存储引擎.用户可以根据不同的需求为数据表选择不同的存储引擎,用户也 ...

最新文章

  1. v9php 碎片信息,phpcms v9碎片管理及调用技巧分享
  2. android中英文混合,搜狗手机输入法Android3.3中英混输无障碍之终结篇
  3. java保存base64图片_java保存base64位的图片,并且用时间文件夹分割
  4. Spring安全–幕后
  5. go爬虫和python爬虫哪个好_python 爬虫实战项目--爬取京东商品信息(价格、优惠、排名、好评率等)-Go语言中文社区...
  6. jmeter上传文件搞了一天,才搞定,没高人帮忙效率就是低,赶紧记下来,以备后用...
  7. bzoj 5302: [Haoi2018]奇怪的背包
  8. Spring框架配置文件 application.xml 示例
  9. python的egg包的安装和制作]
  10. poj 2406 Power Strings(KMP)
  11. 深度优先遍历(Depth First Search)
  12. httpclient.execute长时间停滞问题
  13. nginx 三级域名泛解析并指向某文件 带参数
  14. 华为2288v3安装linux系统,华为RH2288 V3怎么装系统
  15. 国内外电商平台反爬虫机制报告
  16. Mac中Chrome浏览器的快捷键
  17. 彩虹6号 计算机服务设置,彩虹六号围攻各选项效果解析与设置建议 画面优化设置方法...
  18. 波兰式与逆波兰式的转换和表达式求值
  19. 为自己搭建一个分布式 IM 系统二【从查找算法聊起】
  20. 谷歌浏览器恐龙游戏开挂秘诀

热门文章

  1. 纯canvas绘制一幅包含花、草、树的风景图像
  2. Power bi 3.17 漏斗图
  3. 洛谷·bzoj·伟大的奶牛聚集Great Cow Gather
  4. 内连接,外连接(左外,右外),全连接(交集),交叉连接(笛卡尔积)
  5. Collinear Points
  6. 结构体案例—五英雄按年龄排序输出
  7. C#调用第三方平台实现发送短信
  8. 利用xpath爬取斗鱼主播热度和房间标题
  9. 在计算机运行时 存取速度最快的是什么意思,存取速度最快的是什么
  10. 华硕飞行堡垒六(键盘背光)