mysql 聚合索引和聚簇索引_MySQL 聚簇索引 和覆盖索引
一.聚簇索引
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 聚簇索引 和覆盖索引相关推荐
- [MySQL] 索引与性能(3)- 覆盖索引
覆盖索引是指索引的叶子节点已包含所有要查询的列,因此不需要访问表数据,能极大地提高性能.覆盖索引对InnoDB的聚簇索引表特别有用,因为可以避免InnoDB二级索引的二次查询.MySQL里只有B树索引 ...
- mysql 聚簇索引和非聚簇索引_MySQL 聚簇索引 二级索引 辅助索引(上两期中奖名单)...
阅读文本大概需要3分钟. MySQL中每个表都有一个聚簇索引( clustered index ),除此之外的表上的每个非聚簇索引都是二级索引,又叫辅助索引( secondary indexes ). ...
- mysql 聚簇索引和非聚簇索引_MySql聚簇索引与非聚簇索引的区别
通常情况下,建立索引是加快查询速度的有效手段.但索引不是万能的,靠索 引并不能实现对所有数据的快速存取.事实上,如果索引策略和数据检索需求严重不符的话,建立索引反而会降低查询性能.因此在实际使用当中, ...
- mysql主键和聚簇索引_MySQL 聚簇索引一定是主键吗
数据库表的索引从数据存储方式上可以分为聚簇索引和非聚簇索引(又叫二级索引)两种. use myTest; drop table if exists t1; CREATE TABLE `t1` ( `i ...
- mysql聚合函数count用法_MySQL中聚合函数count的使用和性能优化技巧
本文的环境是Windows 10,MySQL版本是5.7.12-log 一. 基本使用 count的基本作用是有两个: 统计某个列的数据的数量: 统计结果集的行数: 用来获取满足条件的数据的数量.但是 ...
- mysql的表是聚集索引组织表_Mysql的Innodb引擎索引总结
索引的目的是什么? 答:数据库添加索引的目的是为了加快查询速度. 索引的的数据结构是什么? 答:(这里的B是balance)B+树来存储索引,B+树类似于二叉树. B+树是怎么查找数据的? 答:B+树 ...
- mysql索引优化规则_Mysql优化选择最佳索引规则
索引的目的在于提高查询效率,其功能可类比字典,通过该索引可以查询到我们想要查询的信息,因此,选择建立好的索引十分重要,以下是为Mysql优化选择最佳索引的方法步骤: 1. 首先列出查询中所有使用的表, ...
- mysql行锁同索引键问题_mysql 锁问题 (相同索引键值或同一行或间隙锁的冲突)
1.使用相同索引键值的冲突 由于mysql 的行锁是针对索引加的锁,不是针对记录加的锁,所以虽然是访问不同行的记录,但如果是使用相同的索引键,是会出现锁冲突的.设计时要注意 例如:city表city_ ...
- mysql数据库存储引擎和索引的描述_Mysql InnoDB引擎的索引与存储结构详解
前言 在Oracle 和SQL Server等数据库中只有一种存储引擎,所有数据存储管理机制都是一样的. 而MySql数据库提供了多种存储引擎.用户可以根据不同的需求为数据表选择不同的存储引擎,用户也 ...
最新文章
- v9php 碎片信息,phpcms v9碎片管理及调用技巧分享
- android中英文混合,搜狗手机输入法Android3.3中英混输无障碍之终结篇
- java保存base64图片_java保存base64位的图片,并且用时间文件夹分割
- Spring安全–幕后
- go爬虫和python爬虫哪个好_python 爬虫实战项目--爬取京东商品信息(价格、优惠、排名、好评率等)-Go语言中文社区...
- jmeter上传文件搞了一天,才搞定,没高人帮忙效率就是低,赶紧记下来,以备后用...
- bzoj 5302: [Haoi2018]奇怪的背包
- Spring框架配置文件 application.xml 示例
- python的egg包的安装和制作]
- poj 2406 Power Strings(KMP)
- 深度优先遍历(Depth First Search)
- httpclient.execute长时间停滞问题
- nginx 三级域名泛解析并指向某文件 带参数
- 华为2288v3安装linux系统,华为RH2288 V3怎么装系统
- 国内外电商平台反爬虫机制报告
- Mac中Chrome浏览器的快捷键
- 彩虹6号 计算机服务设置,彩虹六号围攻各选项效果解析与设置建议 画面优化设置方法...
- 波兰式与逆波兰式的转换和表达式求值
- 为自己搭建一个分布式 IM 系统二【从查找算法聊起】
- 谷歌浏览器恐龙游戏开挂秘诀