zoukankan      html  css  js  c++  java
  • Mysql索引总结

    1. 定义:
      索引(Index)是帮助MySQL高效获取数据的数据结构。可以索引的本质:索引是数据结构。可以理解为”排好序的快速超找数据结构”,在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。
    2. 优势:
      类似大学图书馆建书目索引,提高数据检索效率,降低数据库的IO成本。通过索引对数据进行排序,降低数据排序的成本,降低CPU的消耗。
    3. 劣势:
      实际上索引也是一张表,该表保存了主键与索引字段。并指向实体表的记录,所以索引列也是要占空间的。虽然索引大大提高了查询速度,同时确会降低更新表的速度,如对表进行INSERT、UPDATE、DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件每次更新添加了索引列的字段。都会调整因为更新所带来的键值变化后的索引信息。
       
    4. 索引的分类
      单值索引:即一个索引只包含单个列,一个表可以有多个单列索引。
      唯一索引:索引列的值必须唯一,但允许有空值。
      复合索引:即一个索引包含多个列。
    5. 基础语法:
      创建:
      create [unique] index indexName on mytable(columnname(length));
      alter mytable add [unique] index [indexName] on (columnname(length));
      删除:
      drop index [indexName] on mytable;
      查看:
      show index from table_name;

      PS:使用alter命令有四种方式来添加数据库表的索引,需要注意以下几点:
      创建主键索引,索引值必须唯一且不可为空:
      alter table tab_name add primarykey (column_list);
      创建索引的值必须唯一,(除了NULL外,NULL可以出现多次):
      alter table tab_name add unique index_name (column_list);
      创建普通索引,索引列的值可以出现多次:
      alter table tab_name add index index_name(column_list);
      创建全文检索索引,指定索引为FULLTEXT:
      alter table tab_name add fulltext index_name(column_list);
    6. mysql的索引结构:
      BTree索引,Hash索引,full-text全文索引,R-Tree索引。
    7. 哪些情况需要创建索引:
      ①主键自动建立唯一索引
      ②频繁作为查询条件的字段应该创建索引
      ③查询中与其他表关联的字段,外键关系建立索引
      频繁更新的字段不适合建立索引,因为每次更新不单单是更新了记录还会更新索引
      ⑤WHERE条件里用不到的字段不创建索引
      ⑥单键/组合索引的选择问题,who?(在高并发下倾向创建组合索引)
      ⑦查询中排序的字段,排序的字段若通过索引去访问将大大提高排序速度
      ⑧查询中统计或者分组字段
    8. 哪些情况不要创建索引:
      ①表记录太少
      ②经常增删改的表
      ③如果某个数据列包含许多重复的内容,为它建立索引就没有太大的实际效果。
      提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE、和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。数据重复且分布平均的表字段,因此应该只为最经常查询和最经常排序的数据建立索引。而且需要注意的是,索引并不是实时生效的:
      *如果查询条件中用到了or,即使其中有部分条件带索引也不会被使用,(这也是为什么尽量少用or的原因),要想使用or,又想让索引生效,只能将or条件中的每一列都加上索引。
      *对于多列索引,表结构最先建立索引的字段如果被使用则索引起作用,否则索引无效。
      *查询中应用了like模糊查询以%开头,时索引失效,以%结尾时索引生效。
      *存在索引列的数据类型隐形转换,则用不上索引,比如列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引。
      *where 子句里对索引列上有数学运算,用不上索引。
      *where 子句里对有索引列使用函数,用不上索引。
      *如果mysql估计使用全表扫描要比使用索引快,则不使用索引。

    引用:mysql 多列索引的生效规则


  • 相关阅读:
    文件操作
    MFC
    MFC
    MFC
    MFC
    大陆居民身份证验证方法(java)
    java validator的原理与使用
    解析搜狗词库(python)
    ICTCLAS改进的java版分词软件
    mvn打包
  • 原文地址:https://www.cnblogs.com/ldy-blogs/p/8488892.html
Copyright © 2011-2022 走看看