定义:
索引(Index)是帮助MySQL高效获取数据的数据结构。可以索引的本质:索引是数据结构。可以理解为”排好序的快速超找数据结构”,在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。优势:
类似大学图书馆建书目索引,提高数据检索效率,降低数据库的IO成本。通过索引对数据进行排序,降低数据排序的成本,降低CPU的消耗。劣势:
实际上索引也是一张表,该表保存了主键与索引字段。并指向实体表的记录,所以索引列也是要占空间的。虽然索引大大提高了查询速度,同时确会降低更新表的速度,如对表进行INSERT、UPDATE、DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件每次更新添加了索引列的字段。都会调整因为更新所带来的键值变化后的索引信息。索引的分类
单值索引:即一个索引只包含单个列,一个表可以有多个单列索引。
唯一索引:索引列的值必须唯一,但允许有空值。
复合索引:即一个索引包含多个列。基础语法:
创建:
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);mysql的索引结构:
BTree索引,Hash索引,full-text全文索引,R-Tree索引。哪些情况需要创建索引:
①主键自动建立唯一索引
②频繁作为查询条件的字段应该创建索引
③查询中与其他表关联的字段,外键关系建立索引
④频繁更新的字段不适合建立索引,因为每次更新不单单是更新了记录还会更新索引
⑤WHERE条件里用不到的字段不创建索引
⑥单键/组合索引的选择问题,who?(在高并发下倾向创建组合索引)
⑦查询中排序的字段,排序的字段若通过索引去访问将大大提高排序速度
⑧查询中统计或者分组字段哪些情况不要创建索引:
①表记录太少
②经常增删改的表
③如果某个数据列包含许多重复的内容,为它建立索引就没有太大的实际效果。
提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE、和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。数据重复且分布平均的表字段,因此应该只为最经常查询和最经常排序的数据建立索引。而且需要注意的是,索引并不是实时生效的:
*如果查询条件中用到了or,即使其中有部分条件带索引也不会被使用,(这也是为什么尽量少用or的原因),要想使用or,又想让索引生效,只能将or条件中的每一列都加上索引。
*对于多列索引,表结构最先建立索引的字段如果被使用则索引起作用,否则索引无效。
*查询中应用了like模糊查询以%开头,时索引失效,以%结尾时索引生效。
*存在索引列的数据类型隐形转换,则用不上索引,比如列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引。
*where 子句里对索引列上有数学运算,用不上索引。
*where 子句里对有索引列使用函数,用不上索引。
*如果mysql估计使用全表扫描要比使用索引快,则不使用索引。
作者:白色程序猿