zoukankan      html  css  js  c++  java
  • MySQL SQL调优之索引

    本篇记录MySQL的索引知识学习笔记,也方便自己以后查找复习

    一、索引的概念
    MySQL官方给出的索引定义:索引(Index)是帮助MySQL高效获取数据的数据结构。所以说索引就是排好序的快速查找数据结构

    二、索引分类
    MySQL的索引可以分为几种:

    单值索引:单值索引就是只包含一个列的索引
    唯一索引:唯一索引要求索引列的必须是唯一的,比如说主键或者unique索引,但是还是允许空值
    复合索引:复合索引就是包含多个列组成的索引
    三、索引用法
    创建索引
    create [unique] index indexName on tableName(columnName(length));
    比如给dept表创建索引idx_dept_id
    create idx_dept_id on dept(id);
    修改索引
    ps:修改索引也可以用于新增索引
    语法:

    alter tablename add [unique] index indexname on columnName(length);
    删除索引
    drop index indexname on tablename;
    查看索引
    show index from tablename ;
    如果要显示换行可以加上G,不过就不能加上分号
    show index from tablename G
    附录:
    来自尚硅谷老师总结的新增索引的方法:
    # 添加一个主键,主键是唯一的,不能为Null
    alter table tablename add PRIMARY KEY(columnName);
    #创建唯一索引,要求索引唯一,不过允允许空值
    alter table tablename add unique index indexname on(columnName);
    # 创建普通的索引,索引数据可以不唯一
    alter table tablename add index indexname on(columnName);
    # 指定索引为FullText,用于全文索引
    alter table tablename add FULLTEXT indexname on(columnName);
    四 、索引架构简介
    MySQL的索引结构可以分为:

    BTree索引
    Hash索引
    full-text全文索引
    R-Tree索引

    从图可以看出BTree索引的结构其实就是一棵B+树,并不一定是二叉树,也有可能是一棵多叉树,MySQL也是分为段区块这种结构的,如图,浅蓝色部分就是一个磁盘块,蓝色部分表示数据项,而黄色部分表示指针

    假如我要查找29这个值,就是遍历下来,分别查找磁盘块1、磁盘块3、磁盘块8,根据指针查找下来,速度非常快,假如有几百万数据的话,能走索引的情况,是非常快的,性能对比可想而知

    注意:只有叶子节点(最下面的节点)是存储要查找的数据的,非叶子节点存储的数据只是用于指针索引的数据项而已

    五、索引适用的情况
    1、频繁用于查询的条件适合建立索引
    2、主键默认要加上Primary索引
    3、和其它表有外键关系的列建立索引
    4、where条件后面的条件列可以建上索引
    5、用于排序order by的列可以加上索引
    6、用于分组group by的列可以加上索引
    注意:需要经常修改的列不适合建立索引,因为更新数据的同时也会重新构建索引,比较耗性能;在高并发的情况,更倾向于建立组合索引,因为一般来说,查询很少有一个条件,一般是多个条件,复合索引比较适合

    六、索引不适用的情况
    1、需要经常增删改的表
    2、表的记录很少的情况,加了索引效果不明显
    3、如果某个数据列包含很多重复的数据,比如用户信息表的性别这个列,一般只有两种情况,所以加了索引,是没有太大的实际效果的
    注意:索引应该加在经常查询或者排序的列,数据重复而且分布很平均的情况,是不适合加索引的

    程序员工具站点:草根工具www.idevtool.com  

    个人笔记站点:草根笔记note.idevtool.com

  • 相关阅读:
    轻松搞定Ajax(分享下自己封装ajax函数,其实Ajax使用很简单,难是难在你得到数据后来怎样去使用这些数据)
    模块化开发,SesJS简单总结
    轻松实现HTML5时钟(分享下自己对canvas的理解,原来没你想像的那么难哦)
    轻松搞定javascript预解析机制(搞定后,一切有关变态面试题都是浮云~~)
    javascript中可处理的浮点数的最高精度(和小数的一些小特性)
    PyLucene检索demo
    PyLucene索引DEMO
    Lucene类介绍
    PyLucene 的安装
    写一个程序,打印数字1到100,3的倍数打印“Fizz”来替换这个数,5的倍数打印“Buzz”,对于既是3的倍数又是5的倍数的数字打印“FizzBuzz”
  • 原文地址:https://www.cnblogs.com/benpao/p/11600535.html
Copyright © 2011-2022 走看看