首先索引的分类:
1.从功能逻辑上来说,索引主要可以分为以下几种:
普通索引:最基本的索引类型,没有任何限制,值可以为空,主要用于加速查询。
唯一索引:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一
主键索引:一种特殊的唯一索引,一个表只能有一个主键,不允许有空值。主键索引在创建时通常与表的创建同时进行。
全文索引:主要用于查找文本中的关键字,与直接比较索引中的值不同,全文索引更像是一个搜索引擎,可以高效地处理大量文本数据。
2.按照物理实现方式,索引可以分为:
- 聚簇索引:数据行的物理顺序与键值的逻辑(索引)顺序相同。一个表只能有一个聚簇索引,因为数据行的物理顺序只能有一种。
- 非聚簇索引:数据行的物理顺序与键值的逻辑(索引)顺序不同。非聚簇索引与数据分开存储,并且指向数据的逻辑指针存储在索引中。一个表可以有多个非聚簇索引。
3.按照作用字段个数进行划分,索引可以分为:
- 单列索引:基于单个列创建的索引。
-
组合索引(多列索引):基于多个列创建的索引。组合索引在查询条件中使用了创建索引时的第一个字段时,索引才会被使用,使用组合索引时需要遵循最左前缀原则。
根据数据库的不同,可能还存在其他特定类型的索引,如空间索引、位图索引等。这些索引类型通常用于满足特定的查询需求或优化特定的数据操作
mysql索引:
1.索引以数据页为最小存储单元,一个数据页为16KB
2.一张表中默认是主键是自增索引
3.叶子节点是通过双向链表来绑定的
索引的数据结构:
一般用的是b+树索引,当然也有哈希索引,不过哈希索引用的少, 哈希结构是key,value结构,为什么哈希用的少呢,因为哈希不太能支持范围查询,排序查询这些!
b+树结构 的特点 矮胖
数据全部挂在叶子节点,并且用双向链表来链接,非叶子节点不存储具体的数据!
怎么走索引。
select name,age from ** where name="**"
索引覆盖:
查询的字段都走索引,就叫做索引覆盖
select name,age,address from ** where name="**"
回表的概念:
假如name,age,id有索引,address没有索引, 在查询address时会先走索引查询出来数据,然后根据id走主键索引,再查出数据,查出来address,就是回表。
最左匹配原则: 索引为 name age
select name,age,address from xx where name = xx,age=xx;
select name,age,address from xx where age= xx,name =xx;
在设计索引和使用查询时,应该尽量保证查询条件与索引列的顺序相匹配,以充分利用索引的优势,提高查询性能!
索引下推: 尽量能用索引就用索引
假设我们有一个名为
users
的表,其中有两个字段:id
和@example.com
结尾的用户,并且这些用户的id
字段大于100。SELECT * FROM users WHERE email LIKE '%@example.com' AND id > 100;
使用索引下推的情况下,MySQL服务器会将过滤条件
id > 100
下推到存储引擎层。存储引擎在遍历email LIKE '%@example.com'
和id > 100
这两个条件来过滤数据。这样,只有同时满足这两个条件的数据块才会被返回给MySQL服务器
mysql的锁有行锁和表锁:
表锁:
行锁:innoDb特有:索引行锁,锁的是索引
redis为什么快:
单线程,减少上下文切换 (上下文切换:一个cpu同时只能执行一个A线程的任务,过一会又去执行B线程的任务,不同的线程都要去抢占CPU的资源 时间片)
IO多路复用: 正常每个客户端和服务端连接,每个连接都需要一个线程
因为线程消耗资源,而且不是每个连接时刻都有数据,
io多路复用让一个线程监控多个socket连接
基于内存: 内存离cpu最近
过期删除: 随机抽查删除+惰性删除
内存淘汰: lRU算法 最近最少使用
redis 数据备份
RDB: 全量备份
AOF:增量备份
aof文件太大了,aof重写,+ -合并为一个命令!
redis主从怎么同步,先同步rdb文件,再同步aof文件
分布式锁: 分布式环境下,保证同一时间只有一个节点的一个线程能操作共享资源变量。