1.索引是什么?



        官方定义:索引是帮助MySQL高效获取数据的数据结构,所以索引的本质是数据结构。



        当然还有一个更为简单的理解是:数据本身之外,数据库还维护这一个满足特定查找算法的数据结构,这些数据结构以某种方式指向数据,这样就可以在这些数据结构的基础上实现高级查找算法,



而这个数据结构就是索引。



磁盘上。



一般采用BTREE。



2.索引的优势



        1)类似图书馆建书目索引,提高数据检索的效率,降低数据库的IO成本。



        2)通过索引列对数据进行排序,降低数据排序成本,降低了CPU的消耗。



3.索引的劣势



        1)实际上索引也是一张表,该表的主要内容就是保存索引的字段,并且指向具体表的记录,因此索引会占据空间。



        2)虽然索引可以提高查询速度,同时却会降低更新表的速度,如果对表进行insert、delete和update时,因为在这过程中,MySQL不仅要保存数据到具体表,也要保存索引文件。



        3)索引只是提高sql效率的一个因素,如何建立索引需要花费大量是时间建立适合的索引。



4.索引的分类



        1)单值索引:即一个索引只包含单个列,一个表可以有多个单列索引。



        2)唯一索引:索引列的值必须唯一,但允许有空值。



        3)复合索引:一个索引包含多个数据表字段。(在高并发条件下,倾向建立复合索引)



5.基本语法



        1)创建索引



create [unique] index indexName on mytable(columnName(length));
alter mytable add [unique] index indexName(columnName(length));  ## 两种创建索引方式均可



注意:如果是char,varchar类型,length可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定length。



        2)删除索引



drop index [indexName] on mytable;



        3) 查看表中索引



show index from table_name;



6.需要建立索引的情况



1)主键自动建立唯一索引



        2)频繁作为查询条件的表字段可以建立索引(where)



        3)查询中与其他表关联的表字段,即外键关系可以建立索引



        4)查询中排序的表字段,排序字段若通过索引的方式去访问将大大提高排序速度(order by)



        5)查询中统计或者分组的字段(group by)



7.不需要建立索引的情况 



        1)表记录太少(一般大于几十万、百万的情况,几百,几千,几万的情况,mysql内部的优化器是可以有极快的速度)



        2)经常增删改的表,原因详见索引的劣势第二条



        3)数据重复且分布平均的表字段,例如user表中的sex字段,因为一般只有三种形式:男、女和保密,因此这个字段就不适合当做索引字段



             其中可以通过一个方式简单的查询:  



SELECT COUNT(DISTINCT index_column)/COUNT(*) FROM table_name; -- index_column代表要添加前缀索引的列



            通过该查询得到的比值,比值越大,越有必要建立索引,效率越高



        4)where条件里用不到的字段不知何建立索引



        5) 频繁更新的字段不适合建立索引