一.什么是索引:
索引分单列索引和组合索引:这里比较简单不解释。
创建索引:目的是为了提高查询条件,但是会降低增、删、改的时间。
实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。
建立索引会占用磁盘空间的索引文件。
二、索引类型有那些
FULLTEXT全文索引
可以在REATE TABLE(创建表),ALTER TABLE(添加列),CREATE INDEX(创建索引)的适合使用,但是 CHAR、VARCHAR ,TEXT列表上的
HASH
几乎100%是唯一的,
HASH索引可以一次定位,不需要像树形索引那样逐层查找,因此具有极高的效率。但是,这种高效是有条件的,即只在“=”和“in”条件下高效,对于范围查询、排序及组合索引仍然效率不高。
BTREE
BTREE将索引进行一段的算法,放到二叉树中,查询从root开始,遍历根茎,获取左边的数据。
RTREE
仅支持geometry数据类型,比喻说放经纬度,支持该类型的存储引擎只有MyISAM、BDb、InnoDb、NDb、Archive几种。
三、索引种类
主键索引
提升查询数度、列表唯一,一张表中只能有一个索引
普通索引:加数查询条件,一般查询玩可以关掉索引
唯一索引:多查询、唯一,一个表中可以有多个,常用用平台id+手机号,可以实现,多平台,多商户,用户手机+平台id在整张表中的唯一性。
四、什么时候不使用索引
1、查询中很少使用到的列 不应该创建索引,如果建立了索引然而还会降低mysql的性能和增大了空间需求.
2、很少数据的列也不应该建立索引,比如 一个性别字段 0或者1,在查询中,结果集的数据占了表中数据行的比例比较大,mysql需要扫描的行数很多,增加索引,并不能提高效率
3、定义为text和image和bit数据类型的列不应该增加索引,
4、当表的修改(UPDATE,INSERT,DELETE)操作远远大于检索(SELECT)操作时不应该创建索引,这两个操作是互斥的关系
五、sql优化
[参考:“小米加大炮”大佬的文章]
1、对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。任何在Order by语句的非索引项或者有计算表达式都将降低查询速度
2、在where中避免null的判断,这也会降低查询效率
3、最好不要给数据库流null,尽可能的使用 NOT NULL填充数据库.NULL值也是可能会需要占用空间的,一些定长的数据类型即使数据为NULL也是会占用空间的。
4、应尽量避免在 where 子句中使用 != 或 <> 操作符,否则将引擎放弃使用索引而进行全表扫描。
5、应尽量避免在 where 子句中使用 or 来连接条件,如果一个字段有索引,一个字段没有索引,将导致引擎放弃使用索引而进行全表扫描,可以使用union/union all 代替
6.in 和 not in 也要慎用