zoukankan      html  css  js  c++  java
  • SQL学习笔记之MySQL索引知识点

    0x00 概述

    之前写过一篇Mysql B+树学习,简单的介绍了B+数以及MySql使用B+树的原因,
    有了这些基础知识点,对MySql索引的类型以及索引使用的一些技巧,就比较容易理解了。

    0x01 覆盖索引

    创建了一个辅助索引,如果能直接从这个辅助索引文件中获取到数据,而无需去访问聚集索引(自增主键索引)文件的话,那么这中就用到索引覆盖了。
    这种的效率是极其高的。

    select a from table xxx where b = 2

    像上面这个语句,如果只是为列b建立索引,那么执行这个SQL是可以用到索引的,但是由于a列的数据并没有在这个b索引中,索引需要再次访问聚集索引文件。
    如果建立(b,a)这样的联合索引,那么这个联合索引文件就会包含了a列和b列的值,这样执行上面的语句,就可以用到索引覆盖了。

    0x02 联合索引

    联合索引就是多列索引,存在的目的是为了提高查询性能

    CREATE TABLE `xxxx` (
      `id` int(10) NOT NULL AUTO_INCREMENT COMMENT '自增',
      `code` int(10),
      `age` int(10),
      PRIMARY KEY (`id`),
      KEY `code` (`code`)
    ) ENGINE=InnoDB

    部分同学会觉得直接使用单列索引即可,为啥非要使用联合索引。其实从我上面举得例子就可以发现,只是使用单列索引的话,虽然也是用到了索引,但是经常会回溯到聚集索引,还是有性能损耗的,尤其是还要加上排序等操作,那就更慢了。这里再举一个例子,分页查询

    select id,code from xxxx order by age limit 50000,10;

    如果只是在age列建立索引的话,这个SQL查询的效率不高,但是建立(age,code)怎样的联合索引,就无需回溯到聚集索引,便可完成操作。

    0x03简单枚举值的列不要建立索引

    某个列的值只有0和1,为这种列建立辅助索引就大可不必,因为没任何区分度,比如说按照0来找,从B+数中可以找到一大堆数据,性能差。

    0x04索引列不要参与计算

    B+数存的是key和数据,如要查询的时候,需要对树中的数据先计算后再比较,代价太大了,也极其的慢,因此索引列使用了函数,压根就无法用到索引,MySql也不支持这样做。

    0x05能扩展索引就扩展,尽量别新建

    联合索引的好处已经在上面有提到了,如果数据库有a索引,现在b列也需要索引,那么直接建立(a,b)即可。因为像b=11或者b in (11,22)这种查询,
    MySql是会优化的,可以用到索引的,可以放心使用。

    参考

    参考2

  • 相关阅读:
    机器学习(深度学习)
    机器学习(六)
    机器学习一-三
    Leetcode 90. 子集 II dfs
    Leetcode 83. 删除排序链表中的重复元素 链表操作
    《算法竞赛进阶指南》 第二章 Acwing 139. 回文子串的最大长度
    LeetCode 80. 删除有序数组中的重复项 II 双指针
    LeetCode 86 分割链表
    《算法竞赛进阶指南》 第二章 Acwing 138. 兔子与兔子 哈希
    《算法竞赛进阶指南》 第二章 Acwing 137. 雪花雪花雪花 哈希
  • 原文地址:https://www.cnblogs.com/JetpropelledSnake/p/9396951.html
Copyright © 2011-2022 走看看