关于索引

1.什么是索引?

索引是一种数据结构,能帮我们快速的检索数据库的数据 

2.索引采用那些数据结构呢?

Mysql的结构有两种,Hash索引和B+ tree 索引

我们使用的InnoDb引擎,所以默认使用的B+树

3.关于数据库的引擎

 

4.B+ 与B树什么区别

 

5. B+与hash有什么区别

简单回答:hash有hash表的特点,(注意一下hash表的数据结构和解决冲突的方法!!还有HashMap)

因为Hash索引的底层是哈希表,key - value形式,因为要处理冲突所以数据在存储上面没有任何的顺序关系。

所以没法使用区间查询,对于区间查询就得全表扫描

所以哈希表只适合等值查询的场景

而B+树 是一种多路平衡查询树

他的节点是天然有序的(左子节点小于父节点、父节点小于右子节点),所以对于范围查询的时候不需要做全表扫描

B+Tree索引和Hash索引区别?

  • 哈希索引适合等值查询,但是无法进行范围查询;

  • 哈希索引没办法利用索引完成排序 ;

  • 哈希索引不支持多列联合索引的最左匹配规则;(联合索引是有最左原则的!!!)

  • 如果有大量重复键值的情况下,哈希索引的效率会很低,因为存在哈希碰撞问题。 (大量相同的值,就会导致hash冲突!!!)

 

6. 如果是性别这种单一的,或者一个 标识只有0,1 作为查询条件怎么建立索引?

状态很少的字段没有必要建立索引。

值重复率高的字段不适合建索引。

网友说:一个字段使用拼音首字母做值,共有26种可能,加上索引后,百万加的数据量,使用索引的速度比不使用索引要慢!

所谓索引它就是把一个或几个字段(组合索引)按规律排列起来,再附上该字段所在行数据的物理地址(位于表中)

一个表可能会涉及两个数据结构(文件),一个是表本身,存放表中的数据,另一个是索引。索引是什么?它就是把一个或几个字段(组合索引)按规律排列起来,再附上该字段所在行数据的物理地址(位于表中)。比如我们有个字段是年龄,如果要选取某个年龄段的所有行,那么一般情况下可能需要进行一次全表扫描。但如果以这个年龄段建个索引,那么索引中会按年龄值建一个排列,这样在索引中就能迅速定位,不需要进行全表扫描。

为什么性别不适合建索引呢?因为你访问索引需要付出额外的IO开销,你从索引中拿到的只是地址,要想真正访问到数据还是要对表进行一次IO。假如你要从表的100万行数据中取几个数据,那么利用索引迅速定位,访问索引的这IO开销就非常值了。但如果你是从100万行数据中取50万行数据,就比如性别字段,那你相对需要访问50万次索引,再访问50万次表,加起来的开销并不会比直接对表进行一次完整扫描小。

当然凡事不是绝对,如果把性别字段设为表的聚集索引,那么就肯定能加快大约一半该字段的查询速度了。聚集索引指的是表本身中数据按哪个字段的值来进行排序。因此,聚集索引只能有一个,而且使用聚集索引不会付出额外IO开销。当然你得能舍得把聚集索引这么宝贵资源用到性别字段上。

原文:https://blog.csdn.net/Win32FanEx/article/details/79513857 
结论是 重复性较强的字段,不适合添加索引

show index from table_name; //查看表的所有索引,和对应的缩印的类型。

 

7.如果我不设置主键,那么这个表会有默认的主键吗?不设置主键可以吗?

不设置主键可能会导致数据库表中存在相同的数据

因此可能会产生不想要的操作结果。

可以不设置主键,主键一定自带索引 是B树的类型。

主键有利于提高检索的速度(因为索引吗)

8.主键是唯一的么?一定不为Null么?

不为NULL,且唯一

 

9. 联合索引的最左原则!!

需要做联合索引多个字段之间顺序你们是如何选择的呢?把识别度 使用率最高的字段放到最前面。

但是为什么这样做呢 ?

在创建多列索引时,我们根据业务需求,where子句中使用最频繁的一列放在最左边,因为MySQL索引查询会遵循最左前缀匹配的原则,即最左优先,在检索数据时从联合索引的最左边开始匹配。所以当我们创建一个联合索引的时候,如(key1,key2,key3),相当于创建了(key1)、(key1,key2)和(key1,key2,key3)三个索引,这就是最左匹配原则。

 

 

 

 

10. B+树的叶子节点都可以存那些东西?

InnoDB的B+ Tree可能存储的是整行数据,也有可能是主键的值。

我们一般对于查询概率比较高,经常作为where条件的字段设置索引。

有用过联合索引么?

11.聚簇索引、覆盖索引有什么区别

 

12.MySQL 5.6中,对索引做了哪些优化吗?

Index Condition Pushdown Optimization 

索引下推,默认开启,使用SET optimizer_switch = 'index_condition_pushdown=off';可以将其关闭。

people表中(zipcode,lastname,firstname)构成一个索引

SELECT * FROM people WHERE zipcode='95054' AND lastname LIKE '%etrunia%' AND address LIKE '%Main Street%';

如果没有使用索引下推技术,则MySQL会通过zipcode='95054'从存储引擎中查询对应的数据,返回到MySQL服务端,然后MySQL服务端基于lastname LIKE '%etrunia%'和address LIKE '%Main Street%'来判断数据是否符合条件。

如果使用了索引下推技术,则MYSQL首先会返回符合zipcode='95054'的索引,然后根据lastname LIKE '%etrunia%'和address LIKE '%Main Street%'来判断索引是否符合条件。如果符合条件,则根据该索引来定位对应的数据,如果不符合,则直接reject掉。有了索引下推优化,可以在有like条件查询的情况下,减少回表次数。

 

13. Mysql 8.0的特性?

 

14.  索引下推 

 

15. 回表次数

 

16.SQL语句有没有使用索引查询?

explain查看SQL语句的执行计划,通过执行计划来分析索引使用情况。

 

17. 那什么情况下会发生明明创建了索引,但是执行的时候并没有通过索引呢?

查询优化器

一条SQL语句的查询,可以有不同的执行方案,至于最终选择哪种方案,需要通过优化器进行选择,选择执行成本最低的方案。

在一条单表查询语句真正执行之前,MySQL的查询优化器会找出执行该语句所有可能使用的方案,对比之后找出成本最低的方案。

这个成本最低的方案就是所谓的执行计划。优化过程大致如下:

  • 根据搜索条件,找出所有可能使用的索引;

  • 计算全表扫描的代价;

  • 计算使用不同索引执行查询的代价;

  • 对比各种执行方案的代价,找出成本最低的那一个

 

18. 线上数据的事务隔离级别是什么呀?

 

19. 动态的切换数据库的配置?

 

 

 

 

参考https://mp.weixin.qq.com/s?__biz=Mzg3MzAzMDYxOA==&mid=100000892&idx=1&sn=29eab1254a260169cff854e458dbd5a7&scene=19#wechat_redirect

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值