使用索引的代价:
①索引需要占用硬盘空间,这是空间方面的代价
②一旦插入新数据,就需要重新建立索引,这是时间上的代价。
场景一:数据表规模不大,即使不建立索引,查询语句的返回时间也不长,这时建立索引的意义就不大。如果要建立索引,顶多来说也就是“性价比”不高而已。
场景二:某个商品表中有上万条商品信息,同时每天会在一个时间点往其中增加大概十万条的商品信息,现在用where条件查询时就会很慢。为了提升查询效率可以建立索引,但当每天跟新数据时,又会重建索引,这很耗费时间,这种情况下可以考虑更新前删除索引,更新后再重建索引。
场景三:在数据表中如何ID值都不相同,可以考虑使用索引,相反,如果某个字段重复率很高,如性别字段,或者某个字段大多数值为null,那么就不建议使用索引。
下面举几个栗子可以看的更直观:
①语句一: SELECT name FROM 商品表
。不会建立索引,因为没有where语句。
②语句二: SELECT * FROM 商品表 WHERE name = 'java'
会用到索引,如果项目里经常用到name来查询,且商品表中的数据量很大,而name值的重复率又不是很高,那么就建议建立索引。
③语句三: SELECT * FROM 商品表 WHERE name LIKE '%JAVA'
这个模糊查询,会用到索引,但是用LIKE查询时如果第一个就是模糊的匹配符,比如WHERE name LIKE '%JAVA'
,那么在查询时就不会建立索引。其他情况下,不论用来多少个%,也不论%的位置,只要不出现在第一个位置上,那么都能用到索引。
学生成绩表中有“姓名”和“成绩”两个字段。现在要地成绩这个整数类型的字段建立索引。
- 第一种情况:当数字类型字段遇到非等值操作符时,无法使用索引:例如:
SELECT name FROM 学生成绩 WHERE 成绩 > 95
,一旦出现大于符号,就不能使用索引,为了使用索引我们可以换一种方式:SELECT name FROM 学生成绩 WHERE 成绩 IN(96,97,98,99,100)
- 第二种情况,如果对索引字段进行了某种左值操作,那么无法使用索引。
- 可以使用索引的写法:
SELECT name FROM 学生成绩表 WHERE 成绩 =60
- 不能使用索引的写法:
SELECT name FROM 学生 成绩表 WHERE 成绩+40=100
- 可以使用索引的写法:
- 第三种情况:如果对索引字段进行了函数操作,那么无法用到索引。例如:
SELECT * FROM 商品表 WHERE substr(name)='J'
,我们希望查询商品名首字母是J的记录,可一旦针对name使用函数,即使name字段上有索引 也无法用到。 - -