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. 动态的切换数据库的配置?