Mysql索引总结

2018-06-18 00:58:59来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折

  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 多列索引的生效规则


标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:mysql在表的某一位置增加一列、删除一列、修改列名

下一篇:mysql 的储存引擎