zoukankan      html  css  js  c++  java
  • MySQL优化(2):索引简述

    一、基本语法

      创建索引前会先排序,会影响whereorder by的效率。

      索引也是一张表,保存了主键和索引字段和指向实体表的记录,也是要占空间的,以索引文件的形式存储在磁盘。

      增删改数据时,索引指向也要改变,所以会慢,需要频繁删改的字段不适合建索引。

      索引的建立也需要不断的优化、调整。 

    1、创建,两种写法
      CREATE [UNIQUE] INDEX 索引名 ON 表(列1,列2);
      主键索引:ALTER TABLEADD PRIMARY KEY (列);       #添加一个主键,索引值必须唯一,不能为null   
      唯一索引:ALTER TABLEADD UNIQUE 索引名(列1,列2);    #索引列的值必须唯一,可为null,null可出现多次      
      单值索引:一个索引只包含单个列,一个表可以有多个单列索引
      复合索引:ALTER TABLEADD INDEX 索引名(列1,列2);    #普通索引,索引值可出现多次
      *全文索引:ALTER TABLEADD FULLTEXT 索引名(列);
    2、删除
      DROP INDEX 索引名 ON TABLE;
    3、查看
      SHOW INDEX FROM 表;

    二、索引结构

      1、Btree
      2、Hash索引
      3、full-text全文索引
      4、R-tree索引

      【Btree检索原理】

      树的高度表示最多要查找的次数,广度越广,深度越小查找次数越少

      B+Tree所有索引数据都在叶子结点上

      

      

    三、索引优化思路

      1、开启慢查询日志,设置超过几秒为慢SQL,抓取慢SQL

      2、通过explain对慢SQL分析(重点)

      3、show profile查询SQL在Mysql服务器里的执行细节和生命周期情况(重点)

      4、对数据库服务器的参数调优

      

      接下来几章节对这四步进行总结。

    四、索引使用场景

     哪些情况最好建:

      ①主键会自动建立唯一索引

      ②查询中与其他表关联的字段,外键关系建立索引

      ③频繁作为查询条件的字段应该创建索引

      ④查询或排序后的字段顺序最好和索引一致

      ⑤单值/组合索引的选择问题,在高并发下倾向创建组合索引

      ⑥查询中统计或者分组字段

     哪些情况最好不建:

      ①表记录太少

      ②经常增删改的表,因为更新表时,不仅要保存数据,还要保存索引文件。

      ③如果某个数据列包含许多重复的内容,为它建立索引就没有太大的实际效果,只为最经常查询和最经常排序的数据建立索引。

      ④数据所占空间过大的字段不应建索引,空间占的多,会导致树的深度变大

      (IO次数取决于b+树的高度h,假设当前数据表的数据为N,每个磁盘块数据项数量是m = 磁盘块的大小/数据项的大小,磁盘块的大小是固定,如果数据项占的空间越小,每个磁盘块数据项数量越多,也即每层能容纳更多数量的数据,树高度越低。

      ⑤WHERE条件里用不到的字段不创建索引

      ⑥频繁更新的字段不适合建立索引,因为每次更新不单单是更新了记录还会更新索引

      

     参考链接:https://www.cnblogs.com/ManyQian/p/9076247.html#_label2

  • 相关阅读:
    sprintf函数%u输入long long int型数值异常
    关于smarty模板display函数的$compile_id 参数的意义
    打log的时候如果少写一个%d,cgi会core掉
    c++标准库的源码和SIG实现是什么关系
    2010
    jquery 中jsonp原理最简说明
    1月17日stl string阅读笔记
    Moss母版页制作详解(一)
    Moss中的权限操作
    动态添加和删除表格行
  • 原文地址:https://www.cnblogs.com/zjxiang/p/9142111.html
Copyright © 2011-2022 走看看