当前位置:网站首页>SQL的索引详细介绍
SQL的索引详细介绍
2022-08-01 17:18:00 【m0_54850467】
文章目录

前言
大多数性能问题都和SQL语句有关,本文主要介绍了MySQL中的索引以及索引的重要性。

一、MySQL索引
索引的定义:在关系型数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单(类似于图书目录,通过图书页码迅速找到所需内容)。一个索引是存储的表中一个特定列的值数据结构。索引是在表的列上创建。索引包含一个表中列的值,并且这些值存储在一个数据结构中。
优点:提高数据检索的效率,降低数据排序的成本。
缺点:会降低更新表的速度。
1、聚集索引(主键索引)
聚集索引是将主键与行记录存储在一起,当根据主键进行查询时,可直接在表中获取到数据,不用回表查询。InonDB的所有的表都是索引组织表,主键与数据存放在一起。InnoDB选择聚集索引遵循以下原则:
- 在创建表时,如果指定了主键,则将其作为聚集索引。
- 如果没有指定主键,则选择第一个NOT NULL(非空)的唯一索引作为聚集索引。
- 如果没有唯一索引,则内部会产生一个6字节的rowID(主键值)作为主键

2、二级索引(辅助索引)
二级索引的叶子结点存储了索引值+rowID(主键值)。
建议:在MySQL中创建表时,尽量指定一个显示的自增主键
优势:显示指定的主键可以是普通的int类型,这样存储空间就是4字节,在二级索引的叶子结点中存储主键的所占用空间就会变小
扩展:二级子节点之所以选择存储主键的值,而不是存储主键的指针,是为了避免如果主键位置发生变化时,需要修改二级索引的叶子节点对应存储的指针。

3、基数、选择性、回表
- 基数:字段distinct后的值,主键或NOT NULL(非空)的唯一索引的基数等于表的总行数。
- 选择性:指基数与总行数的比值乘以100%,通常表示在字段上是否适合创建索引。
- 回表:当需要查询的字段不能在索引中完全获取时,需要回表查询取出所需的数据。
为了体现出基数的重要性,做下列测试:
测试相同数据值的cost值的消耗
Ⅰ、在数据库中随便选择一个数据表。
Ⅱ、在数据库中创建一个新表 t1 。
create table t1 (id int , c1 char(20),c2 char(20),c3 char(20));
Ⅲ、插入6条values值相同的测试数据。
insert into t1 values (10,‘a’,‘b’,‘c’);
Ⅸ、为 t1 表添加索引。
create index idx_cl on t1 (c1);
Ⅴ、通过执行计划查看cost值的消耗。(已创建索引)
explain format=json select * from t1 where c1 =‘a’;
Ⅵ、删除索引。
drop index idx_cl on t1;
Ⅶ、再次通过执行计划查看cost值的消耗。(未创建索引)
explain format=json select * from t1 where c1 =‘a’;
总结:对比两次查询的cost值,通过索引查询的cost值比全表扫描的cost值打。通过索引查询时,索引数据都是重复的(基数低),即做了一个索引全扫描,同时 “ SELECT * ”扫描完索引后要回表查询 id , c2 , c3 这几个字段。
清空数据表方便做不同值对比
Ⅷ、清空t1表
truncate table t1;
测试不同数据值的cost值的消耗
Ⅸ、插入6条测试数据,其中 c1 为不同的值。
insert into t1 values (10,‘a’,‘b’,‘c’);
Ⅹ、通过执行计划查看cost值的消耗。(未创建索引)
explain format=json select * from t1 where c1 =‘a’;
Ⅺ、为 t1 表添加索引。
create index idx_cl on t1 (c1);
Ⅻ、通过执行计划查看cost值的消耗。(已创建索引)
explain format=json select * from t1 where c1 =‘a’;
总结:测试不同数据值时,因为字段的值不重复(基数高),通过索引查询的cost值比全表扫描的cost值小。
一般情况下,在创建索引的时候就应该考虑上面的内容(回表、基数、选择性),在MySQl中通过系统表innodb_index_stats来查看索引选择性如何、看到组合索引中每个字段的选择性,以及计算索引大小。

二、MySQL扩展
① SQL优化的重点是:减少SQL语句的扫描行数
② 索引:是一种数据结构,通过缩小一张表中需要查询的记录/行的数目来加快搜索的速度。
③ MySQL存储引擎包括:
- InnoDB存储引擎
- MyISAM存储引擎
- MERGE存储引擎
- MEMORY存储引擎
- ARCHIVE存储引擎
- CSV存储引擎
- BLACKHOLE存储引擎(黑洞引擎)
- PERFORMANCE_SCHEMA存储引擎
- Federated存储引擎
④ InnoDB 和 MyISAM区别:
- InnoDB支持主外键、事务;
- InnoDB是行锁,操作时候只锁一行数据,适合高并发;MyISAM是表索;
- InnoDB不仅缓存索引,还缓存真实数据;MyISAM只缓存索引;
- InnoDB需要表空间大;
- InnoDB关注事务,MyISAM关注性能;

总结
创建索引确实会使查询操作变得更加快速,但不能盲目的创建索引,应只为那些查询操作频繁的列创建索引,因为索引会降低添加、删除、更新操作的速度,执行这些操作的同时会对索引文件进行重新排序或更新。

先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦
边栏推荐
猜你喜欢

The site is not found after the website is filed. You have not bound this domain name or IP to the corresponding site! The configuration file does not take effect!

2022 Strong Net Cup CTF---Strong Net Pioneer ASR wp

金仓数据库 KingbaseES V8.3 至 V8.6 迁移最佳实践(4. V8.3 到 V8.6 数据库移植实战)

ROS2系列知识(5):【参数】如何管理?

星途一直缺颠覆性产品?青岛工厂这款M38T,会是个突破点?

网站备案后没有找到站点 您没有将此域名或IP绑定到对应站点! 配置文件未生效!

MySQL加锁案例分析

TCP million concurrent server optimization parameters

程序员架构修炼之道:如何设计“易理解”的系统架构?

我的新书销量1万册了!
随机推荐
千万级乘客排队系统重构&压测方案总结篇
Vulnhub target drone: HARRYPOTTER_ NAGINI
Bugku-Misc-贝斯手
LeetCode第 303 场周赛
极化微波成像概述2
ROS2支持技术:DDS简述
实现mnist手写数字识别
完美指南|如何使用 ODBC 进行无代理 Oracle 数据库监控?
04 flink cluster construction
[ACNOI2022]物品
金仓数据库 KingbaseES V8.3 至 V8.6 迁移最佳实践(4. V8.3 到 V8.6 数据库移植实战)
变量交换;复合赋值;增递减运算符
Description of common operations and help projects about DevExpress in C#
Daily Yuxian Big Defeat
好家伙,公司服务器直接热崩掉了!
JumpServer堡垒机部署
Unity ui点击事件只响应最上层ui的方式
云商店携手快报税,解锁财务服务新体验!
网上开户佣金万一靠谱吗,网上开户安全吗
程序员架构修炼之道:如何设计“易理解”的系统架构?
Ⅰ、在数据库中随便选择一个数据表。






总结:对比两次查询的cost值,通过索引查询的cost值比全表扫描的cost值打。通过索引查询时,索引数据都是重复的(基数低),即做了一个索引全扫描,同时 “ SELECT * ”扫描完索引后要回表查询 id , c2 , c3 这几个字段。


