SQL 索引

参考文章:MySQL索引(细节十分清楚

索引

  1. 数据量较大的情况下,减少IO次数——加速查询
  2. 其中的primary key 不能NULL,唯一,UNIQUE唯一,还有约束作用)
  3. 建立索引,也就是建立目录的过程
  4. 提前建立索引:如果有大量数据再建,创建速度很慢。
    索引的数据结构之一——BTREE

Btree 原理

  1. B+树上面是树根,中间是树枝,下面是叶子节点,每一个块是磁盘块(BLOCK块),代表一次IO往内存读取的内容,每个块里面有多个数据项和指针,节点不包括指针,其中节点处的磁盘块内的数据项才是真实的数据,上面的数据项相当于假想的数据(目录)。比如寻找17-35之间的某一个数据,那么从上面磁盘块开始,找到介于两者之间的磁盘块,最后往下找到一个对应的节点。
  2. h=log(m+1)/N,数据量N是不变的,m代表的是每个磁盘块的数据项的数量,m越大,数据项数量越多,那么h越小,IO次数越少。这也是为什么把真实的数据项放在节点位置,一旦放在内层的节点,那么数据项数量会下降,导致h升高。并且这也需要我们建立索引的数据项的所占空间越小越小,比如更多倾向于使用Id作为主键而不是name。

聚集索引和辅助索引

聚集索引

  1. 对于MyISAM引擎会单独建立索引文件,但是InnoDB把数据和索引放在一个文件里面。
  2. 对于InnoDB来说
    (1)如果有主键,那么就是聚集索引
    (2)如果没有,取第一个唯一索引(unique)而且只含非空列(NOT NULL)作为主键来聚集索引
    (3)如果都不符合,自己内部创建一个隐藏的主键索引(主键索引对于InnoDB来说就是用来存储数据的原则,便于后期的查询

辅助索引(非聚集

  1. 辅助索引的叶子节点不包含记录的全部数据,但是聚集索引包括
    辅助索引如果可以直接在叶子结点找到想要的数据,那么是覆盖索引
  2. 辅助索引的叶子结点包括辅助索引的数据和主键值,这样如果辅助索引在叶子结点找不到想要的数据,那么就可以再次聚类索引一次Btree

主要的几个索引

  1. 普通索引INDEX:加速查找
  2. 唯一索引:
    主键索引PRIMARY KEY:加速查找+约束(不为空、不能重复)
    唯一索引UNIQUE:加速查找+约束(不能重复
  3. 联合索引:
    PRIMARY KEY(id,name):联合主键索
    UNIQUE(id,name):联合唯一索引
    INDEX(id,name):联合普通索引

索引的创建与删除

  1. 聚类索引
    主键索引
CREATE TABLE t1 (ID int primary key);
CREATE TABLE t1 (ID int,PRIMARY KEY(ID));
ALTER TABLE t1 ADD PRIMARY KEY(ID);
ALTER TABLE t1 DROP PRIMARY KEY;

唯一索引

CREATE TABLE T1
(ID INT UNIQUE);
CREATE TABLE T1 
(ID INT,UNIQUE KEY uni_name(ID));
ALTER TABLE T1 ADD UNIQUE KEY uni_name(ID);
ALTER TABLE T1 DROP INDEX uni_name;

普通索引

CREATE TABLE T1
(ID INT,INDEX index_name(ID));
CREATE index index_name ON T1;
ALTER TABLE T1 ADD index index_name(ID);
ALTER TABLE T1 DROP INDEX index_name;
DROP INDEX index_name ON T1;

索引的使用原则

  1. 范围尽量缩小 使用between 或者<和>
  2. LIKE如果%前面那么会比较久(最左匹配原则
  3. 尽量选择区分度高的列作为索引
  4. 索引太多反而会降低效率
  5. 根据最左匹配原则,建立索引的时候应该把区分度高,范围小的索引放在左边,这样在where中会优先按照原来设置的顺序进行查询
    联合索引:
  6. 联合索引的原则根据上面的最左匹配原则:联合索引的好处是第一个键值相同的情况下,会对第二个键进行排序
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值