前言:索引在sql调优部分占据着重要的位置,了解并深刻索引对咱们来讲也是很是重要的。本篇主要介绍MySQL中索引的相关知识点。html
MySQL官方对索引的定义:索引(Index)是帮助MySQL高效获取数据的数据结构。所以索引的本质就是数据结构。索引的目的在于提升查询效率,可类比字典、书籍的目录等这种形式。算法
可简单理解为“排好序的快速查找数据结构”。在数据以外,数据库系统还维护着知足特定查找算法的数据结构,这些数据结构以某种方式指向数据,这样就能够在这些数据结构上实现高级查找算法,这种数据结构就是索引。sql
通常来讲,索引自己也很大,不可能所有存储在内存中,所以索引每每以索引文件的形式存储在磁盘上。数据库
日常所说的索引,若是没有特别指明,都是B树索引。其中汇集索引、次要索引、覆盖索引、前缀索引、惟一索引默认都是用B树。数据结构
经过show index from tablename能够查看表的索引状况。并发
优势高并发
①相似大学图书馆的书目索引,提升数据的检索效率,下降数据库的IO成本。优化
②经过索引列对数据进行排序,下降数据的排序成本,从而下降CPU的消耗。spa
缺点code
①索引实际上也是一张表,该表保存了主键与索引字段,并指向实体表的记录,因此索引列也要占用空间。
②虽然索引大大提升了查询效率,可是下降了更新表的速度,如insert、update和delete操做。由于更新表时,MySQL不只要保存数据,还要保存索引文件每次更新的索引列字段,而且在更新操做后,会更新相应字段索引的信息。
③索引只是提升查询效率的一个因素,若是你的MySQL有大量的数据表,就须要花时间研究创建最优秀的索引或优化查询语句。
索引主要分为如下三类:
①单值索引:一个索引只包含单个列,一个表能够有多个单值索引。
②惟一索引:索引列的值必须惟一,但容许有空值,主键就是惟一索引。
③复合索引:一个索引包含多个列
索引的结构:
①BTREE索引;②Hash索引;③Full-Text索引;④R-Tree索引。
①建立索引
create [unique] index indexname on tablename(columnname(length)); alter table tablename add index indexname (columnname(length));
注:若是是char、varchar类型的字段,length能够小于字段实际长度;若是是blob、text类型,必须指定length。
②删除索引
drop index indexname on tablename;
③查看索引
show index from tablename;
④其余建立索引的方式
1.添加主键索引 ALTER TABLE `table_name` ADD PRIMARY KEY (`column`) 2.添加惟一索引 ALTER TABLE `table_name` ADD UNIQUE (`column`) 3.添加全文索引 ALTER TABLE `table_name` ADD FULLTEXT (`column`) 4.添加普通索引 ALTER TABLE `table_name` ADD INDEX index_name (`column` ) 5.添加组合索引 ALTER TABLE `table_name` ADD INDEX index_name (`column1`, `column2`, `column3`)
①需创建索引的状况
#1.主键自动创建惟一索引。
#2.频繁做为查询条件的字段。
#3.查询中与其余表关联的字段,外键关系创建索引。
#4.高并发下趋向建立组合索引。
#5.查询中排序的字段,排序字段若经过索引去访问将大大提升排序速度。
#6.查询中统计或分组字段。
②不须要建立索引的状况
#1.表记录太少。(数据量太少MySQL本身就能够搞定了)
#2.常常增删改的表。
#3.数据重复且平均分配的字段,如国籍、性别,不适合建立索引。
#4.频繁更新的字段不适合创建索引。
#5.Where条件里用不到的字段不建立索引。
by Shawn Chen,2018.6.21日,下午。