优化难点与面试点
索引的MySQL官方定义:索引是帮助MySQL快速获取数据的数据结构。
动力节点原文:
MysQL官方对于索引的定义:索引是帮助MySQL高效获取数据的数据结构。
MysQL在存储数据之外,数据库系统中还维护着满足特定查找算法的数据结构,这些数据结构以某种引用(指向)表中的数据,这样我们就可以通过数据结构上实现的高级查找算法来快速找到我们想要的数据。而这种数据结构就是索引。
简单理解为:“排好序的,帮助我们快速查找数据的数据结构”
索引失效的坑
)聚簇是为了提高某个属性(或属性组)的查询速度,把这个或这些属性(称为聚簇码)上具有相同值的元组集中存放在连续的物理块。
聚簇索引(clustered index)不是单独的一种索引类型,而是一种数据存储方式。这种存储方式是依靠B+树来实现的,根据表的主键构造一棵B+树且B+树叶子节点存放的都是表的行记录数据时,方可称该主键索引为聚簇索引。聚簇索引也可理解为将数据存储与索引放到了一块,找到索引也就找到了数据。 索引即数据,数据即索引。
优点
(查询和更新快)
补充:MySQL中,key、primary key、unique key、与index的区别。
详见文章一文搞懂MySQL索引(清晰明了)
数据和索引是分开的,B+树叶子节点存放的不是数据表的行记录。
虽然InnoDB和MyISAM存储引擎都默认使用B+树结构存储索引,但是只有InnoDB的主键索引才是聚簇索引,InnoDB中的辅助索引以及MyISAM使用的都是非聚簇索引。每张表最多只能拥有一个聚簇索引。
InnoDB | MyISAM | |
---|---|---|
①锁粒度 | 行级锁 | 表级锁 |
②是否支持事务 | 是 | 否 |
③聚簇 | 是 | 否 |
因为MyISAM不是聚簇索引,所以可能某条记录在多个B+树索引中出现,很难实现行级锁,因此不支持事务。
ACID:
隔离等级由低到高分别为:
InnoDB使用B+树存储数据,除了主键索引为聚簇索引,其他索引均为非聚簇索引。
一个表中只能存在一个聚簇索引(主键索引),但是可以存在多个非聚簇索引。
InnoDB表和索引的数据是在一起的,表数据和索引的文件都放在.ibd
文件中。
B+树叶子节点包含数据表中行记录就是聚簇索引(索引和数据是存放在一块的)
可以看到叶子节点包含了完整的数据记录,这就是聚簇索引。因为InnoDB的数据文件(.idb)按主键聚集,所以InnoDB必须有主键(MyISAM可以没有),如果没有显示指定主键,则选取首个为唯一且非空的列作为主键索引,如果还没具备,则MySQL自动为InnoDB表生成一个隐含字段作为主键,这个字段长度为6个字节,类型为长整形。
;
主键索引结构分析:
数据保存以key-value的形式保存。
B+树:所有的数据都存放在叶子结点,非叶子结点只保存键值方便查找;
B树:所有的结点都保存数据;
对于MySQL中的InnoDB数据库引擎的主索引,索引即数据,数据即索引。方便范围查找以及顺序查找;同时存在普通索引,帮助查找某些被查找频率较高的字段。如果需要较多索引,推荐使用联合索引,以提高索引的利用效率。
参考文章:一文搞懂MySQL索引(清晰明了)
建立索引确实可以提升查询速度,但前提是要正确使用索引,否则不奏效。
注意
:如果想用or,又想用索引,只能将or条件中的每一列都加上索引。like以%开头;
需要类型转换;
如果查询条件中有字符串,一定要用单引号括起来,否则索引不命中;
where中索引列有运算;
where中索引列使用了函数;
如果MySQL觉得全表扫描更快时(数据少);
自上而下分为四层:
① 网络接入层
② 服务层
③ 存储引擎层
④ 文件系统层
提供了应用程序进入MySQL服务的接口。客户端与服务器建立连接,客户端发送SQL到服务端。
系统管理和控制工具,例如备份恢复、MySQL复制、集群等。
主要负责连接管理、授权认证、安全等。
主要负责连接管理、授权认证、安全等等。每个客户端连接都对应着服务器上的一个线程。服务器上维护了一个线程池,避免为每个连接都创建销毁一个线程。当客户端连接到MySQL服务器时,服务器对其进行认证。可以通过用户名与密码认证,也可以通过SSL证书进行认证。登录认证后,服务器还会验证客户端是否有执行某个查询的操作权限。
索引是占用物理空间的,在不同的的存储引擎中,索引存在的文件也不同。存储引擎是给予表的,以下是分别使用MyISAM和InnoDB分别建立的两张表。
当存储引擎是MyISAM时:
*.frm:与表相关的元数据信息都存放在frm文件,包括表结构的定义信息等