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

  • 相关阅读:
    推荐一个golang的json库
    TinyMind 多标签图像分类竞赛 之路
    动态环境下的slam问题如何解决?
    ubuntu16.04下安装opencv3.4.1及其扩展模块
    Ubuntu 16.04 编译OpenCV 问题解决stdlib.h: No such file or directory
    linux下升级gcc版本(gcc-7)
    基于LSD的直线提取算法
    PL-SLAM
    用U盘制作并安装WIN10 64位原版系统的详细教程(该方法应该适用于任何一版的原版操作系统)
    Win10正式版U盘安装教程
  • 原文地址:https://www.cnblogs.com/JetpropelledSnake/p/9396951.html
Copyright © 2011-2022 走看看