概要: 没有索引的情况下,数据库会遍历全部200条数据后选择符合条件的;而有了相应的索引之后,数据库会直接在索引中查找符合条件的选项。 如果我们把SQL语句换成“SELECT * FROM article WHERE id=2000000”,那么你是希望数据库按照顺序读取完200万行数据以后给你结果还是直接在索引中定位呢?
1. 索引只能用在非空的字段上,因此设计数据库的时候字段能非空就非空。
2. 查询返回少量数据时,索引能优化查询,如果经常返回大量数据,索引会增加额外开销。
3.索引是指把你设置为索引的字段A的内容储存在一个独立区间S里,里面只有这个字段的内容。在找查这个与这个字段A的内容时会直接从这个独立区间里查找,而不是去到数据表里查找。找到的这些符合条件的字段后再读取字段A所指向真实的数据记录的物理地址,再把对应的数据内容输出。 如果你查找的不是索引的字段那么他会从数据表里面查找。因为数据表有很多不相关的字段,数据库程序是不会省略不查找。要判断那些不相关的字段以及多次在记录中跳转是花费一定的资源的。 当然不是设置越多索引就越好。因为索引都放到这个独立区间S,独立区间S越大搜索所占的资源就越大。如果你只有一个字段为索引,那么你搜索这个字段是非常快速的。
4. 虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。建立索引会占用磁盘空间的索引文件。
5.什么情况下不能命中索引
(1)字段有null值(索引字段不能为空)
(2)like + 以%开头的值(%a%不能命中索引,a%能命中索引)
(3)在列上进行函数运算(where YEAR(data))
(4)负向查询(!=,<>,not in,not like)
(5)索引是复合索引,查询字段不符合最左前缀原则(例如复合索引是(a,b,c),语句是where b=1 and c= 1)
(6)如果查询中某个列出现范围查询,那么这个列后面的所有列都无法使用索引(B+树特性)
(7)查询字段的类型和值的类型不一致(例如where a = 1,a是varchar,1是int,那么会出发mysql的隐 式类型转换,where CAST(a AS INT) =1)
6.什么情况下不适合建索引
(1.1)存在null的字段不适合索引
(1)字段的值非常少(比如sex,只能男女,返回的数据量很大,消耗性能)
(2)字段值非常的多(比如说lastLogin,他可能每条记录的值都不一样?待研究)
(3)表频繁的会insert,update,delete(太多的索引会占用空间且增加insert,update,delete的速度)
(4)表的数据量特别小的时候(查询索引的速度可能比遍历表的速度要慢)