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

猜你喜欢

转载自www.cnblogs.com/zjxiang/p/9142111.html