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

  • 相关阅读:
    喜得千金
    ASP.NET MVC +EasyUI 权限设计(四)角色动作
    SQL Server 2008 远程过程调用失败
    ASP.NET MVC +EasyUI 权限设计(三)基础模块
    ASP.NET MVC +EasyUI 权限设计(二)环境搭建
    ASP.NET MVC +EasyUI 权限设计(一)开篇
    Entity Framework学习笔记(六)----使用Lambda查询Entity Framework(1)
    暂停更新Blog
    Entity Framework学习笔记(五)----Linq查询(2)---贪婪加载
    Exp9 Web安全基础
  • 原文地址:https://www.cnblogs.com/JetpropelledSnake/p/9396951.html
Copyright © 2011-2022 走看看