欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Mysql索引总结

程序员文章站 2022-08-05 19:19:56
定义:索引(Index)是帮助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 多列索引的生效规则