数据库索引

Mysql索引数据结构?

顺序查找,二叉树查找,hash索引,二叉树、红黑树,B-Tree,B+Tree:(B-Tree的变种)

01.在创建索引的时候都会考虑哪些因素呢? 什么是联合索引?

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

  两个或更多个列上的索引被称作联合索引,联合索引又叫复合索引。

02.Mysql的索引顺序(最左匹配),做联合索引多个字段之间顺序你们是如何选择的呢?

  识别度最高的字段放到最前面。即符合最左原则。

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

 1.为什么要用索引?

  当一个表中有上千万条数据,如果按名字一行一行去匹配查找,全表扫描,效率会很慢。这时候就需要用索引,相当于给表加了目标和标题,可以缩小查找范围和加快查找速度。

2.什么是索引? 

  索引是一种数据结构。一个索引是存储的表中一个特定列的值数据结构(最常见的是B-Tree和Hash索引)。索引是在表的列上创建。所以,要记住的关键点是索引包含一个表中列的值,并且这些值存储在一个数据结构中。

建一个索引有什么需要考虑的?

1.表的主键、外键必须有索引;经常出现在Where子句中的字段,特别是大表的字段,应该建立索引;索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引;复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替;查询中与其他表有关联的字段,例如外键关系;

3.Hash索引的优缺点?

优点:哈系索引的工作方式是将列的值作为索引的键值(key),和键值相对应实际的值(value)是指向该表中相应行的指针位置。查新name=“jes”这样             的sql效率很快,等值查询的场景更快。

缺点:1.哈希表是无顺的数据结构,假如你想要找出所有小于40岁的员工 就不能用哈希索引。

   2.哈希索引不支持多列联合索引的最左匹配规则 如果有大量重复键值得情况下,哈希索引的效率会很低,因为存在哈希碰撞问题。

4.B-Tree索引是怎么提升性能?

  假设我们在 Employee_Name这一列上创建一个B-Tree索引。这意味着当我们用之前的SQL查找姓名是‘Jesus’的雇员时,不需要再扫描全表。而是用索引查找去查找名字为‘Jesus’的雇员,因为索引已经按照按字母或者数字顺序排序。索引已经排序意 味着查询一个名字会快很多,因为名字少字母为‘J’的员工都是排列在一起的。另外重要的一点是,索引同时存储了表中相应行的指针以获取其他列的数据。

5.使用数据库索引会有什么代价?

  其一,索引会占用空间 - 你的表越大,索引占用的空间越大。

  其二,性能损失(主要值更新操作),当你在表中添加、删除或者更新行数据的时候, 在索引中也会有相同的操作。记住:建立在某列(或多列)索引需要保存该列 最新的数据。基本原则是只如果表中某列在查询过程中使用的非常频繁,那就在该列上创建索引。

6.B+ Tree的叶子节点都可以存哪些东西吗?

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

为什么使用B+树作为索引?

  比B树更适合作为索引的结构是B+树。MySQL中也是使用B+树作为索引。它是B树的变种,因此是基于B树来改进的。为什么B+树会比B树更加优秀呢?
  B树:有序数组+平衡多叉树;
  B+树:有序数组链表+平衡多叉树;

  B+树的关键字全部存放在叶子节点中,非叶子节点用来做索引,而叶子节点中有一个指针指向一下个叶子节点。

  做这个优化的目的是为了提高区间访问的性能。而正是这个特性决定了B+树更适合用来存储外部数据。

7.聚簇索引和非聚簇索引 区别?

  1.聚簇索引:B+ Tree索引的叶子节点存储了整行数据。

  2.非聚簇索引:B+ Tree索引的叶子节点存储了主键的值。

  3.聚簇索引的叶节点就是数据节点,而非聚簇索引的叶节点仍然是索引节点,并保留一个链接指向对应数据块。

   4.聚簇索引查询会更快。因为主键索引树的叶子节点直接就是我们要查询的整行数据了。而非主键索引的叶子节点是主键的值,查到主键的值以后,还需要再通过主键的值再进行一次查询。聚簇索引适合排序,因为聚簇索引本身已经是按照物理顺序放置的,排序很快。

8.为什么聚簇索引查询会更快?

  因为主键索引树的叶子节点直接就是我们要查询的整行数据了。而非主键索引的叶子节点是主键的值,查到主键的值以后,还需要再通过主键的值再进行一次查询(通常称为回表)。而且,非主键索引不一定会查询多次,通过覆盖索引也可以只查询一次。 

9.覆盖索引(covering index):

  指一个查询语句的执行只用从索引中就能够取得,不必从数据表中读取。也可以称之为实现了索引覆盖。

10.MySQL 5.6新加了什么优化?

1、引入了索引下推优化,默认开启。有了索引下推优化,可以在有like条件查询的情况下,减少回表次数。

2.比如:在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条件查询的情况下,减少回表次数。

11.怎么查看索引是否生效?

   在select语句前加上explain就可以了。查看sql语句的执行计划,通过执行计划来分析索引使用情况。

 如:explain select surname,first_name form a,b where a.id=b.id

explain显示了mysql如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。

12.explain 列的解释:

table:显示这一行的数据是关于哪张表的

type:这是重要的列,显示连接使用了何种类型。从最好到最差的连接类型为const、eq_reg、ref、range、 indexhe和ALL

possible_keys:显示可能应用在这张表中的索引。如果为空,没有可能的索引。可以为相关的域从WHERE语句中选择一个合适的语句

key: 实际使用的索引。如果为NULL,则没有使用索引。很少的情况下,MYSQL会选择优化不足的索引。这种情况下,可以在SELECT语句中使用USE INDEX(indexname)来强制使用一个索引或者用IGNORE INDEX(indexname)来强制MYSQL忽略索引

key_len:使用的索引的长度。在不损失精确性的情况下,长度越短越好

ref:显示索引的哪一列被使用了,如果可能的话,是一个常数

rows:MYSQL认为必须检查的用来返回请求数据的行数

Extra:关于MYSQL如何解析查询的额外信息。坏的例子是Using temporary和Using filesort,意思MYSQL根本不能使用索引,结果是检索会很慢
举例: https://blog.csdn.net/Aaroun/article/details/78248509

 

 

原文地址:https://www.cnblogs.com/lgg20/p/11157028.html